【发布时间】:2012-02-21 18:49:51
【问题描述】:
在创建属性时,将所有retains 替换为strong 并将所有assigns 替换为weak 是否正确?
我要切换到 ARC 有什么有用的提示吗?
【问题讨论】:
标签: objective-c ios properties automatic-ref-counting
在创建属性时,将所有retains 替换为strong 并将所有assigns 替换为weak 是否正确?
我要切换到 ARC 有什么有用的提示吗?
【问题讨论】:
标签: objective-c ios properties automatic-ref-counting
阅读Transitioning to ARC Release Notes
使用 Xcode 指南:编辑 > 重构 > 转换为 Objective-C ARC。
一开始它可能会报告各种问题(在预检查构建阶段),只需尝试修复所有问题,再试一次(构建和失败),最终当所有问题都修复时,它会基本顺利完成,将您的代码留给 ARC。
请注意,预检查规则比通常的构建设置更严格。
【讨论】:
简短的回答是肯定的。 strong 是retain 的ARC 等价物,weak 是assign 的等价物,只是它也是归零(如果对象被释放,则将指针设置为nil,防止潜在的EXC_BAD_ACCESS 崩溃) ,所以比assign还要好。如前所述,Transitioning to ARC Release Notes 页面提供了更多详细信息,如果您有兴趣。
【讨论】:
据我所知,strong 和 retain 是同义词,所以它们完全相同。
编辑:unsafe_unretained 也是 @987654324 的同义词@,正如 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 变量如何工作以及它们何时被无效。
【讨论】:
assign和unsafe_unretained在ARC下是等价的