在SO here上有一个类似的问题,但我只想澄清那里没有完全解释的内容。
我理解所有代表和出口 - 事实上任何对“父”对象的引用,要成为一个好公民并且考虑一分钟的对象图 - 应该归结为弱引用。由于零指针的性质在引用对象的保留计数达到零时自动降至零,这是否意味着现在不需要在viewDidUnload
中将IBOutlets设置为nil?
所以,如果我这样声明我的出口:
@property (nonatomic, weak) IBOutlet UILabel *myLabel;
以下代码是否有效?
- (void)viewDidUnload
{
self.myLabel = nil;
[super viewDidUnload];
}
答案 0 :(得分:15)
做一些研究......
据我所知,弱与分配类似,因为它们都是弱引用。
但是,assign不会创建归零引用。即如果有问题的对象被销毁,并且您访问该属性,您将获得BAD_ACCESS_EXCEPTION
。
当引用的对象被销毁时,弱属性会自动归零(= nil)。
在这两种情况下,都没有必要将property设置为nil,因为它不会影响相关对象的保留计数。使用保留属性时必须这样做。
显然,ARC还引入了一个新的“强”属性,与“保留”相同?
研究完成here
答案 1 :(得分:11)
我做了一些测试,看来viewDidUnload
方法中的代码是不必要的。为了支持这一点,viewDidUnload
的文档确实说:
调用此方法时,view属性为nil。
表示弱引用必须自动设置为nil
。
答案 2 :(得分:5)
我有一些经验证据支持IBOutlets确实已经自动设置为nil。这是我做的:
@synthesize myLabel = myLabel_
)设置了明确的ivars,以便稍后我可以在调试器中检查它们的值。viewDidUnload
的第一行启用了断点。viewDidUnload
通过模拟内存警告来调用。明确的ivars都有nil
作为值,然后我点击了断点。
答案 3 :(得分:3)
根据我对如何使用弱引用在ARC中管理插座的理解,您不需要向viewDidUnload添加任何内容,因为它已经是nil。这样做是多余的。
但是如果你确实有强大的出口,苹果公司说如果你指向笔尖中的顶级项目你应该这样做,那么你肯定应该继续在viewDidUnload中添加适当的行以取消这些出口。
答案 4 :(得分:0)
从iOS 5和OS X 10.7开始,weak
将生成自动归零指针。这意味着当指向对象释放时,指针会自动设置为nil
(有关详细信息,请参阅Zeroing Weak References in ARC)。
因此,在iOS 5+和OS X 10.7+下,在weak
方法中手动将IBOutlet
nil
属性设置为viewDidUnload
是没有用的:主视图已卸载,其所有子视图都将被释放,因此相关属性将设置为nil
。