在启用ARC的情况下将强引用对象设置为nil?

时间:2012-08-30 19:32:02

标签: ios xcode automatic-ref-counting weak-references strong-references

我正在开发一个启用了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?

2 个答案:

答案 0 :(得分:2)

viewDidUnloaddealloc

中将您的商店设为零的需求有所不同

拥有ARC意味着您不需要在dealloc方法中编写它(它会自动完成),但viewDidUnload方法有另一个目的,它是释放应用程序的内存发生内存警告时未使用。 在某些情况下仍然需要dealloc,例如,当您的班级注册了通知,或者您的班级是其他人的代表而且您不希望某些错误的回调给您提供错误的访问权时

当您收到内存警告时,所有未显示的UIViewControllers将卸载其视图并调用该方法以释放内存。如果您仍然保留插座(如按钮,桌子等),它们将不会被释放,因此会破坏viewDidUnload方法的目的。

答案 1 :(得分:2)

使用ARC时,无需使用retaincopy等修饰符。使用strongweak修饰符自动完成这种内存管理。

您也不必担心编写dealloc方法。

strong 类似相当于retain,因此您应该用它来标记您的商店

@property(nonatomic, strong) IBOutlet UIButton *bt;

这是界面构建器默认创建它们的方式。

我不会详细介绍它们的语义差异,但如果你想知道发生了什么,你应该真正看看Apple's guide on transitioning to ARC,并阅读strong和{{的详细信息1}}修饰符。

修改 抱歉,默认情况下,界面构建器会创建包含weak的商店。

编辑2: weakstrong确实100%完全相同。 (感谢@Adam)

编辑3: 您将指针设置为retain,以避免出现任何nilmessage sent to deallocated instance错误。

如果您实际使用的是ARC,则应使用BAD_ACCESS_EXCEPTION代替(nonatomic, weak)。通过使用(nonatomic, strong)归零指针,当没有其他任何引用时,编译器会自动将您的出口设置为weak

总而言之,如果您使用nil属性,那么 应该将指针设置为nil。