Ios 具有自定义视图和弱引用的UIViewController

Ios 具有自定义视图和弱引用的UIViewController,ios,objective-c,Ios,Objective C,我更喜欢为所有视图控制器创建自定义视图。我在代码中通过对自定义视图使用弱引用来定义它,如下所示: #import "MyViewController.h" #import "MyCustomView.h" @interface MyViewController () @property (nonatomic, weak) MyCustomView *customView; @end @implementation MyViewController - (void) loadView {

我更喜欢为所有视图控制器创建自定义视图。我在代码中通过对自定义视图使用弱引用来定义它,如下所示:

#import "MyViewController.h"
#import "MyCustomView.h"

@interface MyViewController ()
@property (nonatomic, weak) MyCustomView *customView;
@end

@implementation MyViewController
- (void) loadView
{
    MyCustomView *view = [MyCustomView new];
    self.view = view;
    self.customView = view;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // work with custom view
    self.customView.tableView.delegate = self;
    ....
}

@end

这是弱引用的正确用法吗?应用程序是否会崩溃或泄漏,或者是否会出现其他问题?

当您以编程方式从此控制器中创建实例时,应使用强引用来明确设置此控制器的所有权


如果您分别在IB或soryboard中创建视图对象,那么对相关的
IBOutlet
的弱引用就可以了

当您以编程方式从此控制器中创建实例时,应使用强引用来明确设置此控制器的所有权


如果您分别在IB或soryboard中创建视图对象,那么对相关的
IBOutlet
的弱引用就可以了

正如您在中所看到的,视图控制器的视图属性具有对视图的强引用。因此,只要不将视图属性设置为其他属性,自定义视图对象将被保留。简而言之,您的方法是有效的。

正如您在中所看到的,视图控制器的视图属性具有对视图的强引用。因此,只要不将视图属性设置为其他属性,自定义视图对象将被保留。简而言之,您的方法是有效的。

在这种情况下,
很好。您可以将
CustomView
分配给
self.view
,该视图在
UIViewController
标题中定义为

@property(nonatomic,retain) UIView *view;
因此,
视图
属性具有保留引用

您的
视图
自定义视图
可能会不同步-因此我会尝试将
自定义视图
定义为
只读
,并将getter实现为

- (CustomView *)customView
{
  return (id)self.view;
}

在这种情况下,
可以。您可以将
CustomView
分配给
self.view
,该视图在
UIViewController
标题中定义为

@property(nonatomic,retain) UIView *view;
因此,
视图
属性具有保留引用

您的
视图
自定义视图
可能会不同步-因此我会尝试将
自定义视图
定义为
只读
,并将getter实现为

- (CustomView *)customView
{
  return (id)self.view;
}

谢谢你的重播,赫尔曼。但到已创建视图的强链接保留具有self.view属性的视图控制器。因此,在self.view有效之前,self.customView也将有效。在
self之后,视图
将被视图控制器的内部逻辑销毁
self。自定义视图
也将被销毁。在这种情况下,我看不出有任何问题。啊,是的。我忽略了您在两个“指针”中引用视图对象。好吧其中一个足够强壮。谢谢你的重播赫尔曼。但到已创建视图的强链接保留具有self.view属性的视图控制器。因此,在self.view有效之前,self.customView也将有效。在
self之后,视图
将被视图控制器的内部逻辑销毁
self。自定义视图
也将被销毁。在这种情况下,我看不出有任何问题。啊,是的。我忽略了您在两个“指针”中引用视图对象。好吧其中一个足够强大。@Rob我同意这就是为什么我建议只覆盖
customView
getter方法,这样至少你不必一直使用它。@Rob我同意这就是为什么我建议只覆盖
customView
getter方法,这样至少你不必一直使用它。+1我不喜欢它也可以定义单独的属性。此外,如果使用NIB或故事板,我根本不喜欢实例化
MyCustomView
,而是Rost可以在IB中正确地定义顶级视图的自定义类,并让标准NIB/场景加载逻辑为他处理。@Paul.s是的,使用方法而不是创建属性是个好主意。我相信我会使用这种方法。+1我也不热衷于定义单独的属性。此外,如果使用NIB或故事板,我根本不喜欢实例化
MyCustomView
,而是Rost可以在IB中正确地定义顶级视图的自定义类,并让标准NIB/场景加载逻辑为他处理。@Paul.s是的,使用方法而不是创建属性是个好主意。我相信我会采用这种方法。