IB中的IBOutlet和viewDidUnload
在这里也有一个类似的问题,但是我只想澄清那些在这里没有完全解释的东西。
我明白,所有代表和出路 – 事实上任何提及“父母”的对象,都是一个好的公民,并思考对象图一分钟 – 应该把弱引用归结为零。 由于归零弱指针的性质会自动降到零,而引用对象的保留计数达到零,这是否意味着将IBOutlets设置为零,现在viewDidUnload
现在是不必要的了?
所以,如果我宣布我的出路是这样的:
@property (nonatomic, weak) IBOutlet UILabel *myLabel;
下列代码是否有效?
- (void)viewDidUnload { self.myLabel = nil; [super viewDidUnload]; }
只是做一些研究…
据我所知,弱与分配类似,因为它们都是弱引用。
但是,分配不会创build归零参考。 即如果有问题的对象被销毁,并且您访问该属性,您将得到一个BAD_ACCESS_EXCEPTION
。
当它所引用的对象被销毁时,弱属性自动归零(=零)。
在这两种情况下,没有必要将财产设为零,因为它不会有助于保留对象的保留数量。 使用保留属性时有必要。
显然,ARC还引入了一个新的“强”属性,就像“保留”一样?
研究在这里完成
我做了一些testing,看来viewDidUnload
方法中的代码是不必要的。 为了支持这个, viewDidUnload
的文档实际上是这样说的:
在调用这个方法的时候,view属性是nil。
表明弱参数必须自动设置nil
。
我有一些经validation据支持IBOutlets确实已经自动设置为零。 以下是我所做的:
- 我为我的IBOutlet属性(
@synthesize myLabel = myLabel_
)设置了明确的ivars,以便稍后可以在debugging器中检查它们的值。 - 我在
viewDidUnload
的第一行启用了一个断点。 - 我安排了
viewDidUnload
通过模拟内存警告被调用。 - 我检查了与IBOutlet属性关联的显式ivars的值。
明确的ivars都nil
作为它们的价值,然后我打破了断点。
根据我对如何在ARC中pipe理网点的理解,如果您使用的是弱引用,则不需要向viewDidUnload添加任何内容,因为它已经为零。 这样做是多余的。
然而,如果你有强大的渠道,苹果说,如果你指向笔尖顶级项目,你应该做的,那么你应该继续在viewDidUnload中添加适当的行来删除这些。
从iOS 5和OS X 10.7开始, weak
会产生一个自动归零指针。 这意味着当指出的对象被释放时,指针被自动设置nil
(详细信息请参见清零ARC中的弱引用 )。
因此,在iOS 5+和OS X 10.7+中,将weak
IBOutlet
属性手动设置为viewDidUnload
方法是没有用的:当主视图被卸载时,所有的子视图都会被释放,所以相关的属性被设置到nil
。