16

在 Obj-C 中,属性可以配置为弱/强。实例变量。像以下 -

@interface MyClass {
NSObject *a;
}

MyClass 的对象是否保持弱引用a或强引用或其他?我认为 iVar 在其对象被释放之前不会被释放。为什么我们不为类似 iVar 的属性指定弱/强?

4

3 回答 3

16

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


于 2013-05-09T12:11:08.333 回答
15

您的问题启发了我,我对 ObjectiveC 内存管理进行了深入搜索。我想与你分享一些我从 Apple Doc 获得的东西。

实例变量的默认行为

实例变量默认保持对对象的强引用

为什么我们不为类似 iVar 的属性指定弱/强?

局部变量和非属性实例变量默认保持对对象的强引用。无需显式指定 strong 属性,因为它是默认值。
只有当该变量在范围内,或者直到它被重新分配给另一个对象或 nil 时,变量才会保持对对象的强引用。

如果不想让变量保持强引用,可以将其声明为 __weak,如下所示:

  NSObject * __weak weakVariable;
于 2013-05-09T14:16:56.310 回答
3
@interface MyClass {
__weak NSObject *a;
__strong NSObject *a;
__unsafe_unretained NSObject *obj;
}
于 2013-05-09T12:18:12.053 回答