在Objective-C中,弱引用和强引用长什么样子?

14

维基百科指出,“在计算机编程中,弱引用是一种不会保护所引用的对象免受垃圾回收器回收的引用”。这两种类型的引用在代码中是如何表现的?弱引用是由自动释放消息创建的引用吗?

2个回答

16
以下答案适用于没有垃圾回收机制的情况(例如在iOS中)。 在有垃圾回收机制的情况下,实际上有一个关键字(__weak)可以创建弱引用。
"弱"引用是一种您不保留的引用。
您需要使用这些弱引用来打破循环。常见情况是子对象需要对其父对象进行引用。在这种情况下,父对象将保留对子对象的引用,而子对象对其父对象具有引用,但不保留它。这是因为子对象只需要与父对象一样存在即可。
“弱”引用是否是由自动释放消息创建的引用?
不完全是,那将是一个“非常弱”的引用;-)
自动释放的内容在调用堆栈展开时消失(例如,在每个事件循环结束时)。如果您需要任何内容更长时间,您需要保留一个引用(或像上面的情况一样确保其他部分足够保留它)。

我主要关注iOS SDK。关于iOS 4:那么,所有“assign type”属性和任何简单的将一个对象指针分配给另一个对象而没有显式保留消息的分配都应被视为弱引用吗? - Centurion
1
是的。但请注意,像“alloc”这样的方法包括隐式的“retain”。 - Thilo
@Thillo 如果我们正在使用属性,那么 weakassign 是同样的吗? - M S

6

弱引用是指没有足够的强度来保持对象在内存中的引用,而强引用会强制对象保留在内存中。

如果您已经创建了对任何变量的弱引用,那么您可能会得到 nil。

UITableViewDelegateUIScrollViewDelegate等都是弱引用的例子。

强引用的示例:

MyClass *obj1 = [[Myclass alloc] init];

Myclass *obj2 = obj1;

这里obj2obj1有强引用,意味着如果你将obj2从内存中移除,则obj1也会被移除。


1
obj2是否真的对obj1有强引用?您说“弱引用是一种不足以强制对象保留在内存中的引用”,看着您的例子,向obj1发送释放消息并不能防止obj1被保留在内存中,因为“Myclass * obj2 = obj1;”赋值不会增加obj1的保留计数。在我看来,这是一个弱引用。 - Centurion
你能否解释一下强引用是什么? - Hitesh
我认为,第二个语句“[obj2 retain];”会使它成为强引用。是的,obj2只是指向obj1的指针,两个retain计数都属于在内存中分配并且我认为存储在某个地方的同一个对象。但是每个+1的retain计数都有一个所有者(至少理论上如此),对我来说,最好将该所有者视为用于向目标对象发送显式(retain)或隐式(alloc)保留消息的变量/ivar/property。 - Centurion
保留任何对象意味着您正在拥有该对象,对于任何引用都没有意义!! - Hitesh

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