【问题标题】:How do weak and strong references look like in objective-c?在 Objective-C 中,弱引用和强引用是怎样的?
【发布时间】:2011-11-10 12:27:53
【问题描述】:

维基百科指出“在计算机编程中,弱引用是一种不保护被引用对象不被垃圾收集器收集的引用”。这两种类型的引用在代码中看起来如何?弱引用是由自动发布的消息进行的引用吗?

【问题讨论】:

    标签: iphone objective-c weak-references strong-references


    【解决方案1】:

    弱引用是一种强度不足以强制对象保留在内存中的引用,而强引用则强制对象保留在内存中。

    如果你创建了对任何变量的弱引用,你可能会得到 nil。

    UITableViewDelegateUIScrollViewDelegate 等都是弱引用的例子。

    强引用示例:

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

    这里obj2 强烈引用obj1 意味着如果您从内存中删除obj2,那么obj1 也会被删除。

    【讨论】:

    • obj2 真的对 obj1 有强引用吗?您声明“弱引用是一种不足以强制对象保留在内存中的引用”,并且查看您的示例,向 obj1 发送释放消息不会阻止 obj1 保留在内存中,因为“我的班级 *obj2 = obj1;"赋值不会增加 obj1 上的保留计数。恕我直言,这是一个弱参考。
    • 你能给我解释一下强引用吗??
    • 我想,第二个语句“[obj2 retain];”将使它成为一个强有力的参考。是的,obj2 只是一个指向 obj1 的指针,两个保留计数都属于内存中分配的同一个对象,恕我直言,它存储在某个地方的某个地方。但是每个 +1 保留计数都有一个所有者(至少理论上),对我来说,最好将该所有者视为用于在目标上发送显式(保留)或隐式(分配)保留消息的 var/ivar/property对象。
    • 保留任何对象意味着您正在取得该对象的所有权,对吗?没有任何参考意义!!
    【解决方案2】:

    下面的回答是针对没有垃圾回收的情况(比如iOS)。 在垃圾回收的情况下,实际上有一个关键字(__weak)来创建弱引用。

    “弱”引用是您不保留的引用。

    您需要使用这些弱引用来分解循环。一个常见的情况是需要引用其父对象的子对象。在这种情况下,父对象将保留对子对象的引用,子对象具有对其父对象的引用,但不保留它。这是有效的,因为子对象只需要与父对象一样存在。

    弱引用是由自动发布的消息进行的引用吗?

    不是真的,那将是一个“非常弱的参考”;-)

    当调用堆栈展开时(例如在每个事件循环结束时),自动释放的东西就会消失。如果您需要减少临时性的任何内容,则需要保留参考(或在上述情况下确保其他部分充分保留它)。

    【讨论】:

    • 我最关心的是iOS SDK。关于 iOS 4:那么,所有“分配类型”属性和一个 obj 指针到另一个没有显式保留消息的任何其他简单分配都应该被视为弱引用吗?
    • 是的。但请注意,像“alloc”这样的方法包含一个隐含的“retain”。
    • @Thillo 如果我们使用属性,weak 是否与assign 相同?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多