0

I am developing an iPhone app with ARC option enabled. i am creating IBOutlets in .h files which are connected from file owners icon to .xib elements.for eg.

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

in .m file, i am doing

@synthesize bt;

Is there a need to explicitly set bt to nil in viewDidUnload method? i.e. self.bt = nil; in viewDidUnload?

Also, do I need to write dealloc method with ARC option enabled? When should I make IBOutlets elements as strong and weak references with ARC enabled?

4

2 回答 2

2

需要将您的出口设为零viewDidUnloaddealloc

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

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

于 2012-08-30T19:36:28.187 回答
2

使用 ARC 时,不需要使用诸如retainor之类copy的修饰符。这种内存管理是使用strongandweak修饰符自动完成的。

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

strong相当于所以retain你应该用它标记你的出口

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

这就是界面生成器默认创建它们的方式。

我不会详细介绍它们的语义差异,但是如果您想知道发生了什么并阅读有关修饰符和修饰符的细节,您真的应该看看Apple 的关于过渡到 ARC 的指南。strongweak

编辑: 对不起,界面生成器默认创建插座weak

编辑 2: 确实是 100% 相同的strongretain(感谢@Adam)

编辑3: 您将指针设置nil为避免出现任何message sent to deallocated instance错误BAD_ACCESS_EXCEPTION

如果您实际上正在使用 ARC,则应该制作插座(nonatomic, weak)而不是(nonatomic, strong). 通过使用weak归零指针,编译器所做的就是nil在没有其他东西引用它们时自动将您的出口设置为。

所以,总结一下,如果你使用weak属性,你应该将你的指针设置为 nil。

于 2012-08-30T19:39:12.410 回答