Runtime Asssociate方法關(guān)聯(lián)的對象,是否需要在dealloc中釋放拴孤?
答:不需要釋放
分析
我們知道當(dāng)一個對象銷毀的時候會調(diào)用dealloc方法,那么我們先看下dealloc都進(jìn)行了哪些操作甲捏。
dealloc函數(shù)調(diào)用了_objc_rootDealloc函數(shù)
_objc_rootDealloc函數(shù)調(diào)用rootDealloc函數(shù)
void
_objc_rootDealloc(id obj)
{
ASSERT(obj);
obj->rootDealloc();
}
rootDealloc函數(shù)查看
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);
}
}
從rootDealloc函數(shù)中我們看到了判斷isa相關(guān)屬性的地方演熟,實際上當(dāng)一個對象存在會進(jìn)入else中,即****object_dispose函數(shù)
object_dispose函數(shù)查看
id
object_dispose(id obj)
{
if (!obj) return nil;
objc_destructInstance(obj);
free(obj);
return nil;
}
通過objc_destructInstance函數(shù)找到對象司顿,然后free芒粹,我們看objc_destructInstance函數(shù)
objc_destructInstance函數(shù)
重點查看_object_remove_assocations函數(shù)
_object_remove_assocations函數(shù)分析
類、分類方法同名時調(diào)用順序是怎樣的大溜?
當(dāng)非+load方法同名時化漆,分類的方法在類的方法前面(注意不是覆蓋),因為分類的方法是在類realize之后 attach進(jìn)去的钦奋,所以 優(yōu)先分類座云,其次類
當(dāng)+load方法同名時,優(yōu)先類付材,其次分類
3分類與類的擴(kuò)展
分類
專門用來給類添加新的方法
不能添加屬性朦拖,但是可以通過runtime動態(tài)添加屬性(因為我們在前面的篇章中分析過,分類底層代碼中有屬性列表)
分類中@property定義的變量只會生成setter以及getter方法的聲明厌衔,但是不會生成對應(yīng)的方法實現(xiàn)以及帶有下劃線的成員變量
類的擴(kuò)展
可以添加給類添加屬性贞谓,但是屬于私有變量,比如ViewController的.m文件中@property定義的變量只能是這個ViewController的.m文件使用
添加的方法也是私有方法
什么是Runtime葵诈?
runtime是由C和C++匯編實現(xiàn)的一套API裸弦,為OC語言添加了面向?qū)ο蠛瓦\(yùn)行時功能。
運(yùn)行時:將數(shù)據(jù)類型的確定由編譯階段推遲到了運(yùn)行階段作喘。我們平時所寫的OC代碼理疙,最終轉(zhuǎn)換為runtime的C語言代碼。
方法的本質(zhì)是什么泞坦?SEL窖贤、IMP是什么?兩者之間的關(guān)系是什么贰锁?
方法的本質(zhì)
方法的本質(zhì)是消息的發(fā)送赃梧,涉及到消息發(fā)送的流程有
快速查找:objc_msgSend ~cache_t中查找
慢速查找:遞歸自己以及父類查找,即lookUpImpOrForward
動態(tài)解析:當(dāng)查找不到消息時執(zhí)行動態(tài)解析豌熄,即resolveInstanceMethod
消息快速轉(zhuǎn)發(fā):當(dāng)動態(tài)解析也沒有找到消息授嘀,則進(jìn)行消息快速轉(zhuǎn)發(fā),即forwardingTargetForSelector
消息慢速轉(zhuǎn)發(fā):消息快速轉(zhuǎn)發(fā)沒有找到消息锣险,則進(jìn)行消息慢速轉(zhuǎn)發(fā)蹄皱,即mesthodSignatureForSelector & forwardInvocation
以上流程均沒有找到消息則crash
SEL、IMP
sel:方法編號芯肤,類比一本書的目錄
imp:方法函數(shù)指針地址巷折,類比一本書的頁數(shù)
sel與imp關(guān)系:sel是方法編號,通過sel找到imp的函數(shù)指針地址崖咨,通過imp就能找到函數(shù)的實現(xiàn)
能否向編譯后的類中添加實例變量锻拘?能否向運(yùn)行時創(chuàng)建的類添加實例變量?
不能向編譯后的類中添加實例變量击蹲,因為編譯后實例變量存儲到 ro 中署拟,一旦編譯完成,內(nèi)存結(jié)構(gòu)就完全確定了际邻,無法再次修改
只要類還沒有注冊到內(nèi)存還是可以添加的
可以添加屬性與方法
點擊此處獲得更多學(xué)習(xí)資料
收錄原文地址