【问题标题】:How can the Objective-C runtime know whether a weakly referenced object is still alive?Objective-C 运行时如何知道弱引用对象是否仍然存在?
【发布时间】:2013-02-13 13:26:36
【问题描述】:

随着 ARC 的出现,提供了一些新功能,允许开发人员使用弱引用对象。 id objc_loadWeak(id *location) 就是其中之一。此函数接收一个参数,该参数与内存中存储弱对象的位置相对应,如果该对象仍然存在,则返回该对象,如果已解除分配,则返回 nil

似乎当对象objweak 存储在id objc_storeWeak(id *location, id obj) 的位置location 中时,obj 被放入“弱映射”中,location 作为键。但是,为了检索objobjc_loadWeak不能只使用location作为key并返回对应obj的值。它还必须检查obj 是否还活着,如果不存在则返回nil

但是,objc_loadWeak 无法尝试读取对象的保留计数,因为该对象可能已被释放。此外,虽然弱映射 objc_storeWeakobjc_loadWeakNSObject 类在同一个文件中实现(NSObject.mm),但 NSObjectdealloc 方法不会向弱映射发出信号:被释放的对象正在消失。

那么,Objective-C 运行时如何判断 weak 对象是否仍然存在?

【问题讨论】:

    标签: objective-c automatic-ref-counting weak-references objective-c-runtime


    【解决方案1】:

    NSObject 的 dealloc 方法不会向weak map 发出被释放对象即将消失的信号。

    确实如此。

    - [NSObject dealloc]
    

    通话

    _objc_rootDealloc(self);
    

    反过来调用

    object_dispose()
    

    依次调用

    objc_destructInstance()
    

    最终调用

    objc_clear_deallocating()
    

    最后一个函数如下所示:

        void 
    objc_clear_deallocating(id obj) 
    {
        assert(obj);
        assert(!UseGC);
    
        SideTable *table = SideTable::tableForPointer(obj); /* *** THIS LINE *** */
    
        // clear any weak table items
        // clear extra retain count and deallocating bit
        // (fixme warn or abort if extra retain count == 0 ?)
        OSSpinLockLock(&table->slock);
        if (seen_weak_refs) {
        arr_clear_deallocating(&table->weak_table, obj); /* *** THIS LINE *** */
        }
        table->refcnts.erase(DISGUISE(obj)); /* *** THIS LINE *** */
        OSSpinLockUnlock(&table->slock);
    }
    

    突出显示的三行具有魔力。 SideTable 是在 NSObject.mm 中实现的 C++ 类,其中 refcnts 成员变量的作用与听起来的完全一样:它保存引用计数。

    【讨论】:

    • 哦,是的。我直到最后都没有跟随链条。当我到达object_dispose() 时我停了下来。由于这个函数放在另一个文件中,我认为它与弱引用处理无关。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2018-08-28
    • 1970-01-01
    • 1970-01-01
    • 2022-10-11
    • 2013-03-02
    • 1970-01-01
    • 1970-01-01
    • 2013-01-01
    相关资源
    最近更新 更多