我正在阅读一本最新的书并浏览了ARC部分。它解释了这两个ARC限定符:
弱:弱表示不应保留对象(不会增加保留计数)。 编译器将在之前设置为nil 破坏
__ unsafe__unretained :与弱相同,但在销毁之前对象未设置为nil 。
我的问题是,为什么在它被销毁之前将对象设置为nil是否重要?如果自动释放池摆动并释放被破坏的对象,则不再在内存中使用它。那么,如果对象在被破坏之前设置为nil,为什么会这么重要呢?我想到的唯一一个案例就是如果它是一个单身......
答案 0 :(得分:3)
你问:
我的问题是,为什么在它被销毁之前将对象设置为零是否重要?
它不是"对象"它被设置为nil
,而是引用该对象的weak
变量。让我们假设您有两个对象的引用,一个strong
和一个weak
。我们假设您删除strong
引用(例如,将该变量设置为nil
)。现在该对象没有更多强引用,因此将被释放。 weak
引用的美妙之处在于,现在对象已被释放,弱引用也将设置为nil
,确保您不会意外地尝试使用该内存,即使它早已被解除分配并可能用于其他目的。
这与assign
或unsafe_unretained
行为形成对比:在释放对象后,如果您对其进行了其他assign
引用,则该引用将保持不变,指向内存被释放(这被称为"悬空指针",指向不再存在的东西)。
答案 1 :(得分:2)
__ unsafe_unretained将继续指向对象所在的内存,即使它已被解除分配。由于访问了已释放的对象,这可能导致崩溃。
你总是使用弱,因为它比__unsafe_unretained(因此名称)更安全。 Also from the same thread:
__ unsafe_unretained可用于定义NSString常量的C数组等,例如, NSString __unsafe_unretained * myStrings = {@" Foo",@" Bar",@" Baz",nil};