消息轉(zhuǎn)發(fā)調(diào)用

對象 p? p對象方法Method_list中沒有相關(guān)方法時 的消息查找 步驟

1.動態(tài)方法解析--添加方法實現(xiàn) (注意:這個方法會調(diào)用多次 最好不要用在消息轉(zhuǎn)發(fā))

對象方法

+ (BOOL)resolveInstanceMethod:(SEL)sel{

? ? NSString*method =NSStringFromSelector(sel);

? ? if([methodisEqualToString:@"sendMessage:"]) {

?? ? ? return? class_addMethod(self, sel, (IMP)sendIMP,"V@:@");

? ? }

? ? return NO;

}

voidsendIMP(idself,SEL_cmd,NSString*msg){

? ? NSLog(@"msg = %@",msg);

}

類方法

+(BOOL)resolveClassMethod:(SEL)sel{

? ? ? ? NSString*method =NSStringFromSelector(sel);

? ? if([methodisEqualToString:@"testMessage"]) {

//? ? ? ? NSString *className = NSStringFromClass([animal class]);

//? ? ? ? id is = objc_getClass([className UTF8String]);

? ? ? ? return? class_addMethod(object_getClass([animal class]), sel, (IMP)sendf, "V@:");

? ? ? ? }

? ? ? ? returnNO;

}

void sendf(id self,SEL _cmd){

? ? NSLog(@"messgae");

}

2.快速轉(zhuǎn)發(fā)

對象方法

- (id)forwardingTargetForSelector:(SEL)aSelector{

? ? NSString*method =NSStringFromSelector(aSelector);

? ? if([methodisEqualToString:@"testMessage"]) {

? ? ? ? return[Personnew];

? ? }

? ? return [super forwardingTargetForSelector:aSelector];

}

類方法

+ (id)forwardingTargetForSelector:(SEL)aSelector{

? ? NSString*method =NSStringFromSelector(aSelector);

? ? if([methodisEqualToString:@"testMessage"]) {

? ? ? ? return[Personclass];

? ? }

? ? return [super forwardingTargetForSelector:aSelector];

}

3.正常消息轉(zhuǎn)發(fā)(慢速轉(zhuǎn)發(fā))

//先簽名方法? ?動態(tài)綁定sel(方法名稱指針)-> IMP(方法實現(xiàn)指針)

- (NSMethodSignature*)methodSignatureForSelector:(SEL)aSelector{

? ? NSString*method =NSStringFromSelector(aSelector);

? ? if([methodisEqualToString:@"sendMessage:"]) {

? ? ? ? return [NSMethodSignature signatureWithObjCTypes:"V@:@"];

? ? }

? ? return [super methodSignatureForSelector:aSelector];

}

//

- (void)forwardInvocation:(NSInvocation*)anInvocation{

? ? SELsel = [anInvocationselector];

? ? Person*p = [Personnew];

? ? if ([p respondsToSelector:sel]) {

? ? ? ? [anInvocationinvokeWithTarget:p];

? ? }else{

? ? ? ? [superforwardInvocation:anInvocation];

? ? }

}

4.////未找到方法

- (void)doesNotRecognizeSelector:(SEL)aSelector{

? ? NSLog(@"no selector");

}

5,消息轉(zhuǎn)發(fā)直接調(diào)用 方法簽名的

Person *p =[[Person alloc]init];

? ? NSMethodSignature*methodSign = [pmethodSignatureForSelector:@selector(sendMessage:)];

? ? NSInvocation*invocation = [NSInvocationinvocationWithMethodSignature:methodSign];

? ? invocation.target= p;

? ? invocation.selector=@selector(sendMessage:);

? ? NSString *str = @"invocation";

? ? [invocationsetArgument:&stratIndex:2];2——表示sendMessage:方法的第3個參數(shù)

? ? [invocationinvoke];

最后編輯于
?著作權(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)容

  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 2,042評論 0 9
  • 我們常常會聽說 Objective-C 是一門動態(tài)語言,那么這個「動態(tài)」表現(xiàn)在哪呢?我想最主要的表現(xiàn)就是 Obje...
    Ethan_Struggle閱讀 2,331評論 0 7
  • 本文轉(zhuǎn)載自:http://southpeak.github.io/2014/11/03/objective-c-r...
    idiot_lin閱讀 418評論 0 0
  • ping怎么這么高? 什么是Runtime? 這還要說?run( 運行)、time(時),runtime(運行時)...
    大大盆子閱讀 728評論 1 1
  • runtime 和 runloop 作為一個程序員進階是必須的,也是非常重要的, 在面試過程中是經(jīng)常會被問到的, ...
    made_China閱讀 1,270評論 0 7

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