ios培训之IOS NSInvocation用法

在 iOS中可以直接调用 某个对象的消息 方式有两种

一种是performSelector:withObject:

再一种就是NSInvocation

第一种方式比较简单,能完成简单的调用。但是对于>2个的参数或者有返回值的处理,那就需要做些额外工作才能搞定。那么在这种情况下,我们就可以使用NSInvocation来进行这些相对复杂的*作
 
main.h
 
[html] view plaincopy 
#import <Foundation/Foundation.h>  
#import "MyClass.h"  
  
int main (int argc, const char * argv[])  
{  
  
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];  
  
    MyClass *myClass = [[MyClass alloc] init];  
    NSString *myString = @"My string";  
      
    //普通调用  
    NSString *normalInvokeString = [myClass appendMyString:myString];  
    NSLog(@"The normal invoke string is: %@", normalInvokeString);  
      
    //NSInvocation调用  
    SEL mySelector = @selector(appendMyString:);  
    NSMethodSignature * sig = [[myClass class]   
                               instanceMethodSignatureForSelector: mySelector];  
      
    NSInvocation * myInvocation = [NSInvocation invocationWithMethodSignature: sig];  
    [myInvocation setTarget: myClass];  
    [myInvocation setSelector: mySelector];  
      
    [myInvocation setArgument: &myString atIndex: 2];  
      
    NSString * result = nil;      
    [myInvocation retainArguments];      
    [myInvocation invoke];  
    [myInvocation getReturnValue: &result];  
    NSLog(@"The NSInvocation invoke string is: %@", result);  
  
    [myClass release];  
      
    [pool drain];  
    return 0;  

MyClass.h
 
 
[html] view plaincopy 
#import <Foundation/Foundation.h>  
  
  
@inte***ce MyClass : NSObject {  
      
}  
  
- (NSString *)appendMyString:(NSString *)string;  
  
@end 

MyClass.m
 
 
[html] view plaincopy 
#import "MyClass.h"  
  
  
@implementation MyClass  
  
- (id)init  
{  
    self = [super init];  
    if (self) {  
        // Initialization code here.  
    }  
      
    return self;  
}  
  
- (NSString *)appendMyString:(NSString *)string  
{  
    NSString *mString = [NSString stringWithFormat:@"%@ after append method", string];  
      
    return mString;  
}  
  
- (void)dealloc  
{  
    [super dealloc];  
}  
  
@end  
 
      这里说明一下[myInvocation setArgument: &myString atIndex: 2];为什么index从2开始 ,原因为:0 1 两个参数已经被target 和selector占用

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值