[英]Setting strong references objects to nil with ARC enabled?
我正在开发启用了ARC选项的iPhone应用程序。 我正在.h文件中创建IBOutlets,这些文件从文件所有者图标连接到.xib elements.for。
IBOutlet UIButton *bt;
@property(nonatomic,retain)IBOutlet UIButton *bt;
在.m文件中,我正在做
@synthesize bt;
是否需要在viewDidUnload
方法中将bt
显式设置为nil? 即self.bt = nil;
在viewDidUnload
?
另外,是否需要在启用ARC选项的情况下编写dealloc
方法? 在启用ARC的情况下,何时应将IBOutlets元素作为强引用和弱引用?
在viewDidUnload
和dealloc
中将网点设置为零的需求之间是有区别的
拥有ARC意味着您不需要在dealloc
方法中编写它(它会自动完成),但是viewDidUnload
方法还有另一个用途,它是在出现内存警告时释放应用程序未使用的内存。 在某些情况下,例如,当您的课程注册为通知时,或者当您的课程是其他人的委托并且您不希望出现一些故障回调时,仍然需要使用dealloc
当您收到内存警告时,所有未显示的UIViewControllers
将卸载其视图并调用该方法以释放内存。 如果您仍然保留插座(如按钮,表格等),它们将不会被释放,因此会破坏viewDidUnload方法的用途。
例如,在使用ARC时,无需使用诸如retain
或copy
类的修饰符。 使用strong
修饰符和weak
修饰符会自动完成这种内存管理。
您也不必担心编写dealloc
方法。
strong
是一种等价的 retain
,所以你应该用它标记您的店铺
@property(nonatomic, strong) IBOutlet UIButton *bt;
这就是界面生成器默认创建它们的方式。
我不会详细介绍它们的语义差异,但是如果您想了解发生了什么并了解strong
修饰符和weak
修饰符的细节,则应该真正查看Apple过渡到ARC的指南 。
编辑:对不起,默认情况下,界面生成器会创建带有weak
的插座。
编辑2: strong
和retain
确实是100%相同。 (感谢@Adam)
编辑3:您将指针设置为nil
以避免将任何message sent to deallocated instance
或BAD_ACCESS_EXCEPTION
错误。
如果您实际使用的是ARC,则应将出口(nonatomic, weak)
而不是(nonatomic, strong)
做成。 通过使用weak
归零指针,编译器将自动执行将出口设置为nil
,而没有其他引用它们的情况。
因此,总而言之,如果您不使用weak
属性, 则应将指针设置为nil。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.