Dealloc 实现 原理

当Objective-C对象的引用计数变为0时,系统调用dealloc方法释放内存。此过程首先从当前类开始,然后逐级向上到父类,直到 NSObject。objc_destructInstance负责析构对象,包括调用C++析构函数和移除关联对象。根据对象的isa引用计数,可能调用不同的清理函数,处理弱引用。在dealloc过程中,弱引用会被自动置为nil。object_cxxDestruct方法由编译器生成,用于处理类中的实例变量释放。总结来说,dealloc方法确保对象的内存有效释放,并处理所有相关联的资源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当对象的引用计数Wie0时, 系统会调用对象的dealloc方法释放

- (void)dealloc {
    _objc_rootDealloc(self);
}

在内部

void
_objc_rootDealloc(id obj)
{
    assert(obj);

    obj->rootDealloc();
}

继续调用了rootDealloc方法

显然调用顺序为:先调用当前类的dealloc,然后调用父类的dealloc,最后到了NSObject的dealloc.

 

inline void
objc_object::rootDealloc()
{
    //判断对象是否采用了Tagged Pointer技术
    if (isTaggedPointer()) return;  // fixme necessary?
    //判断是否能够进行快速释放
    //这里使用了isa指针里的属性来进行判断.
    if (fastpath(isa.nonpointer  &&  //对象是否采用了优化的isa计数方式
                 !isa.weakly_referenced  &&  //对象没有被弱引用
                 !isa.has_assoc  &&  //对象没有关联对象
                 !isa.has_cxx_dtor  &&  //对象没有自定义的C++析构函数
                 !isa.has_sidetable_rc  //对象没有用到sideTable来做引用计数
                 ))
    {
        //如果以上判断都符合条件,就会调用C函数 free 将对象释放
        assert(!sidetable_present());
        free(this);
    } 
    else {
        //如果以上判断没有通过,做下一步处理
        object_dispose((id)this);
    }
}

 内部做了一些判断, 如果满足这五个条件,直接调用free函数,进行内存释放.

当一个最简单的类(没有任何成员变量,没有任何引用的类),这五个判断条件都是成立的,直接free.

 

id 
object_dispose(id obj)
{
    if (!obj) return nil;

    objc_destructInstance(obj);    
    free(obj);

    return nil;
}

调用objc_destructInstance函数来析构对象obj,再free(obj)释放内存.

objc_destructInstance内部函数会销毁C++析构函

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值