- ** 如果我們使用關(guān)鍵字 @dynamic 在類的實(shí)現(xiàn)文件中修飾一個(gè)屬性伺糠,表明我們會為這個(gè)屬性動(dòng)態(tài)提供存取方法蒙谓,編譯器不會再默認(rèn)為我們生成這個(gè)屬性的 setter 和 getter 方法了,需要我們自己提供 **
- 當(dāng) Runtime 系統(tǒng)在 Cache 和類的方法列表(包括父類)中找不到要執(zhí)行的方法時(shí)训桶,Runtime 會調(diào)用一下兩個(gè)方法來給我們一次動(dòng)態(tài)添加方法實(shí)現(xiàn)的機(jī)會:
/* 添加實(shí)例方法 */
resolveInstanceMethod:
/* 添加類方法 */
resolveClassMethod:
/* 完成向特定類添加特定方法實(shí)現(xiàn)的操作 */
class_addMethod
- 下面的例子為 resolveThisMethodDynamically 方法添加了實(shí)現(xiàn)內(nèi)容累驮,就是 dynamicMethodIMP 方法中的代碼。其中 “v@:” 表示返回值和參數(shù)舵揭。示例代碼:
void dynamicMethodIMP(id self, SEL _cmd)
{
// implementation ....
}
@implementation MyClass
+ (BOOL)resolveInstanceMethod:(SEL)aSEL
{
if (aSEL == @selector(resolveThisMethodDynamically))
{
class_addMethod([self class], aSEL, (IMP) dynamicMethodIMP, "v@:");
return YES;
}
return [super resolveInstanceMethod:aSEL];
}
@end
- ** 注意:動(dòng)態(tài)方法解析會在* 消息轉(zhuǎn)發(fā)機(jī)制侵入前 *執(zhí)行 **
- ** 動(dòng)態(tài)方法解析器將會首先給予提供該方法選擇器對應(yīng)的 IMP 的機(jī)會谤专。如果你想讓該方法選擇器被傳送到轉(zhuǎn)發(fā)機(jī)制,就讓 resolveInstanceMethod: 方法返回 NO午绳。 **
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者