在创建属性时,将所有retains
替换为strong
,将所有assigns
替换为weak
是否正确?
我正在转向ARC任何有用的提示吗?
答案 0 :(得分:4)
阅读Transitioning to ARC Release Notes
使用Xcode的指南:编辑>重构>转换为Objective-C ARC。
首先,它可能会报告各种问题(在预先检查构建阶段),只需尝试修复所有问题,再试一次,(再次构建和失败),并且当所有问题都得到修复时,最终会顺利完成,将代码留给ARC。
请注意,预检规则比通常的构建设置更难。
答案 1 :(得分:2)
据我所知,strong
和retain
是同义词,因此完全相同。
修改:unsafe_unretained
也是assign
的同义词,正如 nielsbot 指出的那样。
然后weak
几乎就像assign
,但在指向的对象被解除分配后自动设置为nil。
这意味着,您只需更换它们即可。
但是,我遇到过一个特例,我必须使用assign
而不是weak
。假设我们有两个属性delegateAssign
和delegateWeak
。两者都存储了我们的代表,即拥有唯一强大的参考资料。该委托正在解除分配,因此我们也调用了-dealloc
方法。
// Our delegate is deallocating and there is no other strong ref.
- (void)dealloc {
[delegateWeak doSomething];
[delegateAssign doSomething];
}
委托已经处于释放过程中,但仍未完全取消分配。问题是 weak
对他的引用已经无效!属性delegateWeak
包含nil,但delegateAssign
包含有效对象(所有属性已经释放并且无效,但仍然有效。)
// Our delegate is deallocating and there is no other strong ref.
- (void)dealloc {
[delegateWeak doSomething]; // Does nothing, already nil.
[delegateAssign doSomething]; // Successful call.
}
这是一个非常特殊的情况,但它揭示了这些weak
变量如何工作以及它们何时无效。
答案 2 :(得分:1)
简短的回答是肯定的。 strong
是ARC等效于retain
,weak
相当于assign
,只有它也为零(如果对象设置指针nil
被解除分配,防止潜在的EXC_BAD_ACCESS
崩溃),因此它甚至比assign
更好。如前所述,Transitioning to ARC Release Notes页面会在您感兴趣时提供更多详细信息。