Message Forwarding总结

在Objective-C中,如果你将一个没有实现的消息发送给一个接受者,系统会调用接受者forwardInvocation:方法,从而给这个接受者一个二次处理的机会。机遇这个特性,我们可以做一些自己的处理。

例如下面的调用,我们调用了一个不存在的方法,系统就会调用myObject对象的forwardInvocation:方法。

objc_msgSend(self, @selector(didnotexistmethod:)


-(void) forwardInvocation:(NSInvocation *)anInvocation
{
    NSLog(@"test");
    SEL sel = [anInvocation selector];
    NSLog(@"forwardInvocation, %s", sel_getName(sel));
    
    NSInteger numberAug = [[anInvocation methodSignature] numberOfArguments];
    NSLog(@"arg number:%d", numberAug);
    
    MyObject* myobj = [[MyObject alloc] init];
    if ([myobj respondsToSelector:sel])
    {
        //[anInvocation setArgument:(void*)"it's a test param" atIndex:2];
        [anInvocation invokeWithTarget:myobj];
    }
    else
    {
        [super forwardInvocation:anInvocation];
    }
    
}

-(void)oneParamMethod:(NSArray*)param
{
    NSLog(@"oneParamMethod");
}

- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector
{
    NSMethodSignature* sig = [ViewController instanceMethodSignatureForSelector:@selector(oneParamMethod:)];
    
    return sig;
    //return [NSMethodSignature signatureWithObjCTypes:"@^v^ci"];
}

实现代码如上所示,为了forwardInvocation方法能被正确的调用,我们必须实现methodSignatureForSelector:方法。

 

然后我们在MyObject中实现如下, param就是我们在调用的时候传递的参数。

-(void) didnotexistmethod:(id)param
{
    NSLog(@"MyObject didnotexistmethod is called");    
}



 

                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值