對象的釋放:
NSObject調用dealloc后調用順序:dealloc --> objc_rootDealloc -->objc_dispose -->objc_destructInstance
重點關注objc_destructInstance函數,里面做了三件事情:
1.object_cxxDestruct :釋放變量
object_cxxDestruct最終會調用emitCXXDestructMethod,這個函數遍歷當前對象的所有實例變量,并調用objc_storeStrong函數,objc_storeStrong里會將變量release掉;ARC下[super dealloc]方法也由編譯器自動插入
2._object_remove_assocations:移除對象的關聯對象
關聯對象是由AssociationsManager來管理,存儲在AssociationsHashMap類型的全局表中。在對象dealloc后,會調用_object_remove_assocations遍歷對象對應的HashMap全局表,然后釋放掉;
3.objc_clear_deallocating:清空引用計數表和弱引用表,并將所有的weak引用置為nil;