在使用ARC的Objective-C中,您能保证相关对象的生命周期吗?

时间:2013-12-01 11:34:57

标签: objective-c automatic-ref-counting

我已经看到很多代码使用关联的对象来执行对象的清理。

e.g。 NSObject+BlockObservation

部分代码是在ARC之前编写的。

现在,浏览ReactiveCocoa的问题,我发现了这个问题:https://github.com/ReactiveCocoa/ReactiveCocoa/pull/580

引用:

  

Dealloc一次性物品现在被一个混乱的-dealloc拆除,而不是作为一个相关的物体(后来发生,并且可能导致释放后使用错误)。

那么,我们是否可以继续使用关联对象来解决ARC下的自动观察删除问题,或者这些代码是否在ARC下被破坏?

1 个答案:

答案 0 :(得分:1)

http://www.opensource.apple.com/source/objc4/objc4-493.9/runtime/objc-runtime-new.mm

所示:

void *objc_destructInstance(id obj) 
{
    if (obj) {
        Class isa_gen = _object_getClass(obj);
        class_t *isa = newcls(isa_gen);

        // Read all of the flags at once for performance.
        bool cxx = hasCxxStructors(isa);
        bool assoc = !UseGC && _class_instancesHaveAssociatedObjects(isa_gen);

        // This order is important.
        if (cxx) object_cxxDestruct(obj);
        if (assoc) _object_remove_assocations(obj);

        if (!UseGC) objc_clear_deallocating(obj);
    }

    return obj;
}

这段代码基本上是-[NSObject dealloc]的大部分实现。换句话说,在释放“owner”对象之前,关联对象或多或少地被释放,因此你应该希望在这些对象上运行的唯一东西是NSObject提供的功能。

幸运的是,KVO和NotificationCenter都允许您通过说出“名称(读取地址)”并成为NSObject来取消注册,所以我希望一切都很好。

我认为ARC不会以任何方式与该讨论相关。