Runtime-(七)動態(tài)添加方法

在說動態(tài)添加方法之前,我們先來看一個問題

Q: 使用performSelector:可能會遇到什么問題?

這個方法不會檢查對象的方法實現(xiàn),所以可能會Crash。

我們可以在消息傳遞的時候動態(tài)的添加方法。

void testImp(void) {
    NSLog(@"this is test method!");
}

+ (BOOL)resolveInstanceMethod:(SEL)sel {
    /*
     這個方法的參數(shù):
     cls: 為哪個類添加方法
     name: 方法名
     imp: 方法實現(xiàn)
     types: 方法返回值和方法參數(shù)
    */
    class_addMethod(self, @selector(aTestMethod), testImp, "v@:");
    return YES;
}

動態(tài)方法解析

Q: 是否使用過@dynamic?

當(dāng)我們聲明一個屬性,并且在實現(xiàn)中聲明為@dynamic時,是告訴編譯器,這個屬性的get/set方法在運(yùn)行時添加,而不是在編譯時添加方法的實現(xiàn)。

這里涉及到動態(tài)運(yùn)行時語言和編譯時語言的區(qū)別

  • 動態(tài)運(yùn)行時語言將函數(shù)決議推遲到運(yùn)行時
  • 編譯時語言在編譯期間決議

Runtime實戰(zhàn)

Q: [obj foo]和objc_msgSend()函數(shù)之間有什么關(guān)系?

Q: runtime如何通過Selector找到對應(yīng)的IMP地址的?

Q: 能否向編譯后的類中增加實例變量?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 2016年國慶假期終于把此書過完,整理筆記和體會于此。 關(guān)于書名 書名源于俄羅斯的演員斯坦尼斯拉夫斯基創(chuàng)作的《演員...
    李劍飛的簡書閱讀 7,453評論 2 65
  • 1、通過CocoaPods安裝項目名稱項目信息 AFNetworking網(wǎng)絡(luò)請求組件 FMDB本地數(shù)據(jù)庫組件 SD...
    陽明AI閱讀 16,210評論 3 119
  • 當(dāng)你某一天遇到某個人的時候,你可能會覺得自己不夠美好,不夠完美。遇見那個人,一切都改變了。 愿親愛的你,溫柔如水,...
    唐云杉閱讀 233評論 1 2
  • “愿不愿意去極樂世界?” “愿意!” “想不想快點去?” “想!” “真的想假的想?” “真的!” 佛來了,垂手接...
    彌陀教我念彌陀閱讀 382評論 4 5

友情鏈接更多精彩內(nèi)容