4-11-对象dealloc release 发生了什么

2020-09-15  本文已影响0人  Rumbles

参考
iOS对象release做的那些事
1.先调用当前类的dealloc,然后调用NSObject类的dealloc。这里我们可以推定,多次继承的情况下其dealloc调用顺序应该为:先子类然后父类的顺序,最后到了NSObject根类。

2.快速销毁的:对象快速销毁发生在:指针被优化过,没有被弱引用,没有关联对象,没有C++或ARC析构器,以及引用计数可以内连储存时------本质上是当前对象的所有信息都存在在这一个指针内时.
一般销毁:有属性的

3.一般销毁object_dispose的具体操作是什么?

从object_dispose的实现来看,其首先执行objc_destructInstance方法,然后释放内存。而objc_destructInstance具体的工作包括三部分:

1、如果当前实例有.cxx_Destruct方法,则执行之;

2、如果当前实例有关联对象,则移除之;

3、执行clearDeallocating,其内部所做的工作为从weak列表中移除(如果被弱引用)以及销毁引用计数的存储指针(如果引用计数很大不能内联存储),这里的weak列表和引用计数都保存在一个叫SideTable的全局结构体中,此结构体在runtime运行期内不会被析构;

iOS对象release做的那些事

(本文所有内容都是针对64位架构,ARC环境而言)
已优化的isa,前面已经讲过引用计数首先会存储于extra_rc字段;当extra_rc不够用时和为优化的isa一样存储于SideTable中;实现代码和上面大同小异:

总的来说,release方法主要是处理引用计数;由于isa有优化(arm64架构)和未优化之分,引用计数存储的位置不同,所以这其中包括对不同情况的判断;但总的逻辑就是引用计数减1,然后判断引用计数是否为0,如果为0则调用dealloc方法,释放对象

总的来说,dealloc方法做的处理:清空引用计数,清除weak弱引用指针,删除关联对象
上一篇下一篇

猜你喜欢

热点阅读