我正在开发一个启用了ARC选项的iPhone应用程序。我正在.h文件中创建IBOutlets,这些文件从文件所有者图标连接到.xib元素。例如。
IBOutlet UIButton *bt;
@property(nonatomic,retain)IBOutlet UIButton *bt;
<。>在.m文件中,我正在做
@synthesize bt;
是否需要在bt
方法中明确将viewDidUnload
设置为nil?即self.bt = nil;
中的viewDidUnload
?
另外,我是否需要在启用ARC选项的情况下编写dealloc
方法?我应该何时将IBOutlets元素作为强启用弱引用并启用ARC?
答案 0 :(得分:2)
在viewDidUnload
和dealloc
拥有ARC意味着您不需要在dealloc
方法中编写它(它会自动完成),但viewDidUnload
方法有另一个目的,它是释放应用程序的内存发生内存警告时未使用。
在某些情况下仍然需要dealloc
,例如,当您的班级注册了通知,或者您的班级是其他人的代表而且您不希望某些错误的回调给您提供错误的访问权时
当您收到内存警告时,所有未显示的UIViewControllers
将卸载其视图并调用该方法以释放内存。如果您仍然保留插座(如按钮,桌子等),它们将不会被释放,因此会破坏viewDidUnload方法的目的。
答案 1 :(得分:2)
使用ARC时,无需使用retain
或copy
等修饰符。使用strong
和weak
修饰符自动完成这种内存管理。
您也不必担心编写dealloc
方法。
strong
类似相当于retain
,因此您应该用它来标记您的商店
@property(nonatomic, strong) IBOutlet UIButton *bt;
这是界面构建器默认创建它们的方式。
我不会详细介绍它们的语义差异,但如果你想知道发生了什么,你应该真正看看Apple's guide on transitioning to ARC,并阅读strong
和{{的详细信息1}}修饰符。
修改强>
抱歉,默认情况下,界面构建器会创建包含weak
的商店。
编辑2:
weak
和strong
确实100%完全相同。 (感谢@Adam)
编辑3:
您将指针设置为retain
,以避免出现任何nil
或message sent to deallocated instance
错误。
如果您实际使用的是ARC,则应使用BAD_ACCESS_EXCEPTION
代替(nonatomic, weak)
。通过使用(nonatomic, strong)
归零指针,当没有其他任何引用时,编译器会自动将您的出口设置为weak
。
总而言之,如果您不使用nil
属性,那么 应该将指针设置为nil。