当对象的引用计数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++析构函