NSObject的释放--object_cxxDestruct 释放成员变量
NSObject的释放
通过runtime源码,很清晰的可以看,NSObject调用dealloc后产生函数调用链如下:
dealloc --> objc_rootDealloc -->objc_dispose -->objc_destructInstance
最终调用了一个objc_destructInstance函数,这个函数的定义如下:
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);
//这里是重点
if (cxx) object_cxxDestruct(obj);
if (assoc) _object_remove_assocations(obj);
if (!UseGC) objc_clear_deallocating(obj);
}
return obj;
}
在objc_destructInstance函数中,我们可以看到这里面做了三件事情:
(1)object_cxxDestruct 做一些释放相关的操作
(2)_object_remove_assocations:移除对象的关联对象,也就是说对象的关联对象是在objc_destructInstance函数中释放的。
(具体是如何执行关联对象的释放,后续我们还会讲到)
(3)objc_clear_deallocating:清空引用计数表和弱引用表,并将所有的weak引用置为nil。(也就是我们的weak引用在dealloc后能够自动置为nil是因为在这里执行了置为nil的操作)
作者:好雨知时节浩宇
链接:https://www.jianshu.com/p/eec3fb94b2e6
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
我思故我在