如果对象在销毁时为零,为什么重要?

时间:2015-05-05 03:04:48

标签: objective-c automatic-ref-counting

我正在阅读一本最新的书并浏览了ARC部分。它解释了这两个ARC限定符:

  

:弱表示不应保留对象(不会增加保留计数)。 编译器将在之前设置为nil   破坏

     

__ unsafe__unretained :与弱相同,但在销毁之前对象未设置为nil

我的问题是,为什么在它被销毁之前将对象设置为nil是否重要?如果自动释放池摆动并释放被破坏的对象,则不再在内存中使用它。那么,如果对象在被破坏之前设置为nil,为什么会这么重要呢?我想到的唯一一个案例就是如果它是一个单身......

2 个答案:

答案 0 :(得分:3)

你问:

  

我的问题是,为什么在它被销毁之前将对象设置为零是否重要?

它不是"对象"它被设置为nil,而是引用该对象的weak变量。让我们假设您有两个对象的引用,一个strong和一个weak。我们假设您删除strong引用(例如,将该变量设置为nil)。现在该对象没有更多强引用,因此将被释放。 weak引用的美妙之处在于,现在对象已被释放,弱引用也将设置为nil,确保您不会意外地尝试使用该内存,即使它早已被解除分配并可能用于其他目的。

这与assignunsafe_unretained行为形成对比:在释放对象后,如果您对其进行了其他assign引用,则该引用将保持不变,指向内存被释放(这被称为"悬空指针",指向不再存在的东西)。

答案 1 :(得分:2)

From this SO answer:

  

__ unsafe_unretained将继续指向对象所在的内存,即使它已被解除分配。由于访问了已释放的对象,这可能导致崩溃。

你总是使用弱,因为它比__unsafe_unretained(因此名称)更安全。 Also from the same thread:

  

__ unsafe_unretained可用于定义NSString常量的C数组等,例如, NSString __unsafe_unretained * myStrings = {@" Foo",@" Bar",@" Baz",nil};