在创建属性时,用strong
替换所有retains
,用weak
替换所有assigns
是否正确?
我将转到ARC,有什么有用的提示吗?
阅读过渡到ARC发行说明
使用Xcode的指南:编辑>重构>转换为Objective-C ARC.
起初,它可能会报告各种问题(在预检查构建阶段),只需尝试修复所有问题,再试一次,然后(构建并失败),最终当所有问题都得到修复时,它将基本顺利地完成,将代码留给ARC。
请注意,预检查规则比通常的构建设置更严格。
据我所知,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
变量是如何工作的,以及它们何时无效。
简短的回答是肯定的。strong
是retain
的ARC等价物,weak
是assign
的等价物,只是它也在归零(如果对象被释放,则将指针设置为nil
,防止潜在的EXC_BAD_ACCESS
崩溃),所以它甚至比assign
更好。如前所述,如果您感兴趣,"过渡到ARC发行说明"页面将提供更多详细信息。