美文网首页
源码解读: dealloc原理

源码解读: dealloc原理

作者: jameiShi | 来源:发表于2018-12-25 17:29 被阅读12次

    源码
    主要过程:

    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;
    }
    

    相关文章

      网友评论

          本文标题:源码解读: dealloc原理

          本文链接:https://www.haomeiwen.com/subject/gxoekqtx.html