iVars引用是强引用、弱引用还是什么?

17
在Obj-C中,属性可以配置为weak/strong。实例变量如下所示 -
@interface MyClass {
NSObject *a;
}

MyClass的对象对变量a保持弱引用还是强引用,或者是其他类型的引用?我认为只有在对象被释放之后,iVar才会被释放。
为什么我们不像属性一样指定iVar的弱/强引用?

3个回答

16

默认的ivar引用是__strong,尽管您可以显式地将其设置为__weak__strong



有没有办法将ivar声明为copy或assign? - JoJo

15

您的问题启发了我,我对Objective-C内存管理进行了深入的搜索。我想与您分享一些我从苹果文档中获得的内容。

实例变量的默认行为

实例变量默认情况下会保持对对象的强引用。

为什么我们不像属性那样为 iVar 指定 weak/strong?

局部变量和非属性实例变量默认情况下会保持对对象的强引用。不存在明确指定强属性的需求,因为这是默认设置。
变量仅在其所在作用域内或重新分配给其他对象或 nil 时才会保持对对象的强引用。

如果您不希望变量保持强引用,可以将其声明为 __weak,例如:

  NSObject * __weak weakVariable;

3
@interface MyClass {
__weak NSObject *a;
__strong NSObject *a;
__unsafe_unretained NSObject *obj;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接