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



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

我将转到ARC,有什么有用的提示吗?

阅读过渡到ARC发行说明

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

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

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

据我所知,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变量是如何工作的,以及它们何时无效。

简短的回答是肯定的。strongretain的ARC等价物,weakassign的等价物,只是它也在归零(如果对象被释放,则将指针设置为nil,防止潜在的EXC_BAD_ACCESS崩溃),所以它甚至比assign更好。如前所述,如果您感兴趣,"过渡到ARC发行说明"页面将提供更多详细信息。

最新更新