源码解读: dealloc原理

2018-12-25  本文已影响12人  jameiShi

源码
主要过程:

1、首先判断对象是不是isTaggedPointer,如果是TaggedPointer那么没有采用引用计数技术,所以直接return
2、不是TaggedPointer


我们还是直接从源码中查找,我们在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;
}
上一篇下一篇

猜你喜欢

热点阅读