IOS NSInvocation应用与理解
来源:互联网 发布:tp-link软件下载 编辑:程序博客网 时间:2024/06/03 19:52
NSInvocation是IOS消息传递和方法调用的一个类,简单用法总结。
IOS中有一个类型是SEL,它的作用很相似与函数指针,通过performSelector:withObject:函数可以直接调用这个消息。但是perform相关的这些函数,有一个局限性,其参数数量不能超过2个,否则要做很麻烦的处理,与之相对,NSInvocation也是一种消息调用的方法,并且它的参数没有限制。这两种直接调用对象消息的方法,在IOS4.0之后,大多被block结构所取代,只有在很老的兼容性系统中才会使用,简单用法总结如下:
一、初始化与调用
在官方文档中有明确说明,NSInvocation对象只能使用其类方法来初始化,不可使用alloc/init方法。它执行调用之前,需要设置两个方法:setSelector: 和setArgument:atIndex:
- (void)viewDidLoad { [super viewDidLoad]; SEL myMethod = @selector(myLog); //创建一个函数签名,这个签名可以是任意的,但需要注意,签名函数的参数数量要和调用的一致。 NSMethodSignature * sig = [NSNumber instanceMethodSignatureForSelector:@selector(init)]; //通过签名初始化 NSInvocation * invocatin = [NSInvocation invocationWithMethodSignature:sig]; //设置target [invocatin setTarget:self]; //设置selecteor [invocatin setSelector:myMethod]; //消息调用 [invocatin invoke]; }-(void)myLog{ NSLog(@"MyLog");}
注意:签名函数的参数数量要和调用函数的一致。测试后发现,当签名函数参数数量大于被调函数时,也是没有问题的。
调用多参数的方法,我们可以这样写:
- (void)viewDidLoad { [super viewDidLoad]; SEL myMethod = @selector(myLog:parm:parm:); NSMethodSignature * sig = [[self class] instanceMethodSignatureForSelector:myMethod]; NSInvocation * invocatin = [NSInvocation invocationWithMethodSignature:sig]; [invocatin setTarget:self]; [invocatin setSelector:myMethod2]; int a=1; int b=2; int c=3; [invocatin setArgument:&a atIndex:2]; [invocatin setArgument:&b atIndex:3]; [invocatin setArgument:&c atIndex:4]; [invocatin invoke];}-(void)myLog:(int)a parm:(int)b parm:(int)c{ NSLog(@"MyLog%d:%d:%d",a,b,c);}
注意:1、这里设置参数的Index 需要从2开始,因为前两个被selector和target占用。下面这样写也没有任何问题:
- (void)viewDidLoad { [super viewDidLoad]; SEL myMethod = @selector(myLog:parm:parm:); SEL myMethod2 = @selector(myLog); NSMethodSignature * sig = [[self class] instanceMethodSignatureForSelector:myMethod]; NSInvocation * invocatin = [NSInvocation invocationWithMethodSignature:sig]; ViewController * view = self; [invocatin setArgument:&view atIndex:0]; [invocatin setArgument:&myMethod2 atIndex:1]; int a=1; int b=2; int c=3; [invocatin setArgument:&a atIndex:2]; [invocatin setArgument:&b atIndex:3]; [invocatin setArgument:&c atIndex:4]; [invocatin retainArguments]; [invocatin invoke];}-(void)myLog:(int)a parm:(int)b parm:(int)c{ NSLog(@"MyLog%d:%d:%d",a,b,c);}
2、这里的传参方式必须是传递参数地址。
二、NSInvocation的返回值
NSInvocation对象,是可以有返回值的,然而这个返回值,并不是其所调用函数的返回值,需要我们手动设置:
- (void)viewDidLoad { [super viewDidLoad]; SEL myMethod = @selector(myLog:parm:parm:); NSMethodSignature * sig = [[self class] instanceMethodSignatureForSelector:myMethod]; NSInvocation * invocatin = [NSInvocation invocationWithMethodSignature:sig]; [invocatin setTarget:self]; [invocatin setSelector:myMethod2]; ViewController * view = self; int a=1; int b=2; int c=3; [invocatin setArgument:&view atIndex:0]; [invocatin setArgument:&myMethod2 atIndex:1]; [invocatin setArgument:&a atIndex:2]; [invocatin setArgument:&b atIndex:3]; [invocatin setArgument:&c atIndex:4]; [invocatin retainArguments]; //我们将c的值设置为返回值 [invocatin setReturnValue:&c]; int d; //取这个返回值 [invocatin getReturnValue:&d]; NSLog(@"%d",d); }-(int)myLog:(int)a parm:(int)b parm:(int)c{ NSLog(@"MyLog%d:%d:%d",a,b,c); return a+b+c;}
注意:这里的操作传递的都是地址。如果是OC对象,也是取地址。
三、关于内存
可以注意到- (void)retainArguments;这个方法,它会将传入的所有参数以及target都retain一遍。
0 0
- IOS NSInvocation应用与理解
- IOS NSInvocation应用与理解
- IOS NSInvocation应用与理解
- iOS NSInvocation应用与理解
- iOS消息机制 NSInvocation的深入理解
- iOS NSInvocation
- IOS学习笔记之十六:NSInvocation的理解和使用
- [iOS] NSInvocation简单使用
- IOS NSInvocation用法
- iOS NSInvocation用法
- IOS NSInvocation用法简介
- IOS NSInvocation用法
- iOS NSInvocation的学习
- [iOS] NSInvocation简单使用
- ios NSInvocation简单使用
- [iOS] NSInvocation简单使用
- iOS NSInvocation的使用
- ios NSInvocation简单使用
- spring模板模式与callback
- Shell 字符串处理、获取文件名和后缀名
- vector<bool>效率问题的原因和替代方法
- 二叉排序树
- hdu2108Shape of HDU 计算几何
- IOS NSInvocation应用与理解
- Qt的5种常用布局搭建
- Lua继承的实现(__index元方法)
- Java反射简介
- 修复sublime text3在ubuntu下无法中文输入
- 程序员如何做到年薪 50 万?--知乎整理
- AngularJs的初步使用
- Oracle TNSListener服务启动后自动停止问题
- 利用Java Apache POI 生成Word文档