正确使用ARC(自动参考计数)?

时间:2012-01-29 19:25:31

标签: objective-c ios properties automatic-ref-counting

在创建属性时,将所有retains替换为strong,将所有assigns替换为weak是否正确?

我正在转向ARC任何有用的提示吗?

3 个答案:

答案 0 :(得分:4)

阅读Transitioning to ARC Release Notes

使用Xcode的指南:编辑>重构>转换为Objective-C ARC。

首先,它可能会报告各种问题(在预先检查构建阶段),只需尝试修复所有问题,再试一次,(再次构建和失败),并且当所有问题都得到修复时,最终会顺利完成,将代码留给ARC。

请注意,预检规则比通常的构建设置更难。

答案 1 :(得分:2)

据我所知,strongretain是同义词,因此完全相同。
修改:unsafe_unretained也是assign的同义词,正如 nielsbot 指出的那样。

然后weak几乎就像assign,但在指向的对象被解除分配后自动设置为nil。

这意味着,您只需更换它们即可。

但是,我遇到过一个特例,我必须使用assign而不是weak。假设我们有两个属性delegateAssigndelegateWeak。两者都存储了我们的代表,即拥有唯一强大的参考资料。该委托正在解除分配,因此我们也调用了-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等效于retainweak相当于assign,只有它也为零(如果对象设置指针nil被解除分配,防止潜在的EXC_BAD_ACCESS崩溃),因此它甚至比assign更好。如前所述,Transitioning to ARC Release Notes页面会在您感兴趣时提供更多详细信息。