我已经看到很多代码使用关联的对象来执行对象的清理。
e.g。 NSObject+BlockObservation
部分代码是在ARC之前编写的。
现在,浏览ReactiveCocoa的问题,我发现了这个问题:https://github.com/ReactiveCocoa/ReactiveCocoa/pull/580
引用:
Dealloc一次性物品现在被一个混乱的
-dealloc
拆除,而不是作为一个相关的物体(后来发生,并且可能导致释放后使用错误)。
那么,我们是否可以继续使用关联对象来解决ARC下的自动观察删除问题,或者这些代码是否在ARC下被破坏?
答案 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不会以任何方式与该讨论相关。