dealloc
当调用dealloc方法的时候,执行顺序可以在源码中查找如下(objc源码):
1.
// Replaced by NSZombies
- (void)dealloc {
_objc_rootDealloc(self);
}
2.
void
_objc_rootDealloc(id obj)
{
assert(obj);
obj->rootDealloc();
}
3.
inline void
objc_object::rootDealloc()
{
if (isTaggedPointer()) return; // fixme necessary?
if (fastpath(isa.nonpointer &&
!isa.weakly_referenced &&
!isa.has_assoc &&
!isa.has_cxx_dtor &&
!isa.has_sidetable_rc))
{
assert(!sidetable_present());
free(this);
}
else {
object_dispose((id)this);
}
}
4.
id
object_dispose(id obj)
{
if (!obj) return nil;
objc_destructInstance(obj);
free(obj);
return nil;
}
5.
void *objc_destructInstance(id obj)
{
if (obj) {
// Read all of the flags at once for performance.
bool cxx = obj->hasCxxDtor();
bool assoc = obj->hasAssociatedObjects();
// This order is important.
if (cxx) object_cxxDestruct(obj);
if (assoc) _object_remove_assocations(obj); //清除成员变量
obj->clearDeallocating(); //将指向当前对象的弱指针置为nil
}
return obj;
}