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 类型的属性相同,例如 delegate
s,它们是 weak
属性,因为您将 class 分配给了 属性 . VC 显然被强烈持有,因此委托人应避免强烈持有 VC 以防止保留循环(其中 a
强烈持有 b
和 b
强烈支持 a
)。
所以回答你的问题,一个weak
属性如果没有强烈的东西会立即发布,以上是你的场景将使用 weak
属性.
字符串是一个不好的例子。有些对象永远不会被释放。常量字符串、[NSNull null]、@YES 和@NO、32 位的小 NSNumber 值和 64 位的许多 NSNumber 值、空数组等。因为它们没有被释放,所以弱变量永远不会为零。
许多对象是自动释放的。如果除了它们的自动释放池之外没有其他引用它们,它们会在池消失时消失。
但是,如果您使用 alloc/init 创建一个对象并将其存储在一个弱变量中,编译器就会知道 alloc/init 的引用计数为 1,该引用计数将被删除,噗!它去。如果您首先将引用存储到默认情况下为强的局部变量中,那么当代码离开局部变量的范围时它就会消失。如果你先存入一个弱变量,然后立即从弱变量存入一个强变量,那就太晚了,它已经消失了。
由于引用计数变为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 类型的属性相同,例如 delegate
s,它们是 weak
属性,因为您将 class 分配给了 属性 . VC 显然被强烈持有,因此委托人应避免强烈持有 VC 以防止保留循环(其中 a
强烈持有 b
和 b
强烈支持 a
)。
所以回答你的问题,一个weak
属性如果没有强烈的东西会立即发布,以上是你的场景将使用 weak
属性.
字符串是一个不好的例子。有些对象永远不会被释放。常量字符串、[NSNull null]、@YES 和@NO、32 位的小 NSNumber 值和 64 位的许多 NSNumber 值、空数组等。因为它们没有被释放,所以弱变量永远不会为零。
许多对象是自动释放的。如果除了它们的自动释放池之外没有其他引用它们,它们会在池消失时消失。
但是,如果您使用 alloc/init 创建一个对象并将其存储在一个弱变量中,编译器就会知道 alloc/init 的引用计数为 1,该引用计数将被删除,噗!它去。如果您首先将引用存储到默认情况下为强的局部变量中,那么当代码离开局部变量的范围时它就会消失。如果你先存入一个弱变量,然后立即从弱变量存入一个强变量,那就太晚了,它已经消失了。