Objective C,ARC下什么时候释放弱对象?

In Objective C, When is weak object released under ARC?

由于引用计数变为0会导致对象被释放。 我很好奇弱对象什么时候被释放,因为计数总是0,当我声明一个弱对象时,我是否需要担心它会被释放到一半?

例如

NSObject ClassA

@property (weak) NSString stringA;


- init() {
    ...
    stringA = @"this is a weak string";
    ...
}

- doSomething() {
    // When I call this function later, 
    // is there any chance at this point stringA has been released?
    NSLog(stringA);
}

如果它是通过 IBOutlet 或作为 delegate/datasource[=34 连接的,则只能声明弱 属性 =](引用另一个 UIViewController)。

如果你做一个弱的属性,它会在实例化后立即释放。但是,通过 IBOutlet 连接的 weak 属性 将不会释放,因为视图强烈支持 属性。

与 VCs 类型的属性相同,例如 delegates,它们是 weak 属性,因为您将 class 分配给了 属性 . VC 显然被强烈持有,因此委托人应避免强烈持有 VC 以防止保留循环(其中 a 强烈持有 bb强烈支持 a)。

所以回答你的问题,一个weak属性如果没有强烈的东西会立即发布,以上是你的场景将使用 weak 属性.

字符串是一个不好的例子。有些对象永远不会被释放。常量字符串、[NSNull null]、@YES 和@NO、32 位的小 NSNumber 值和 64 位的许多 NSNumber 值、空数组等。因为它们没有被释放,所以弱变量永远不会为零。

许多对象是自动释放的。如果除了它们的自动释放池之外没有其他引用它们,它们会在池消失时消失。

但是,如果您使用 alloc/init 创建一个对象并将其存储在一个弱变量中,编译器就会知道 alloc/init 的引用计数为 1,该引用计数将被删除,噗!它去。如果您首先将引用存储到默认情况下为强的局部变量中,那么当代码离开局部变量的范围时它就会消失。如果你先存入一个弱变量,然后立即从弱变量存入一个强变量,那就太晚了,它已经消失了。