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是的,使用方法而不是创建属性是个好主意。我相信我会采用这种方法。