在說動態(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: 能否向編譯后的類中增加實例變量?