源码解读: dealloc原理
2018-12-25 本文已影响12人
jameiShi
源码
主要过程:
1、首先判断对象是不是isTaggedPointer,如果是TaggedPointer那么没有采用引用计数技术,所以直接return
2、不是TaggedPointer
- 清除成员变量
- 将指向当前对象的弱引用指针置为nil
我们还是直接从源码中查找,我们在NSObject.mm可以查找到dealloc函数
- (void)dealloc {
_objc_rootDealloc(self);
}
点击进入_objc_rootDealloc函数
_objc_rootDealloc(id obj)
{
assert(obj);
obj->rootDealloc();
}
里面还是没有我们想要的,点击rootDealloc
objc_object::rootDealloc()
{
if (isTaggedPointer()) return;
object_dispose((id)this);
}
这个里面有我们想要的信息
1、首先判断对象是不是isTaggedPointer,如果是TaggedPointer那么没有采用引用计数技术,所以直接return
2、不是TaggedPointer,就去销毁这个对象object_dispose
我们继续点击object_dispose
id
object_dispose(id obj)
{
if (!obj) return nil;
objc_destructInstance(obj);
free(obj);
return nil;
}
里面仅仅是简单的判断,我们还需要继续找我们需要的东西,点击objc_destructInstance
函数
void *objc_destructInstance(id obj)
{
if (obj) {
Class isa = obj->getIsa();
if (isa->hasCxxDtor()) {
object_cxxDestruct(obj);
}
if (isa->instancesHaveAssociatedObjects()) {
_object_remove_assocations(obj);//清除成员变量
}
objc_clear_deallocating(obj);//将指向当前对象的弱引用指针置为nil
}
return obj;
}