NSInvocation类的学习

转载 2015年11月20日 00:06:11

IOS中有一个类型是SEL,它的作用很相似与函数指针,通过performSelector:withObject:函数可以直接调用这个消息。但是perform相关的这些函数,有一个局限性,其参数数量不能超过2个,否则要做很麻烦的处理,与之相对,NSInvocation也是一种消息调用的方法,并且它的参数没有限制。

NSInvocation对象只能使用其类方法来初始化,不能使用alloc/init方法。它执行调用之前,需要设置两个方法:

  • setSelector::用来设置selector;
  • setArgument:atIndex:用来为消息传递参数

看一下简单使用的代码:

invocation.h文件代码

#import <Foundation/Foundation.h>

@interface invocation : NSObject

-(void)invoker;
-(void)myLog;
@end

invocation.m文件代码

#import "invocation.h"

@implementation invocation

-(void)invoker{
    SEL myMethod=@selector(myLog);
    NSMethodSignature *sig=[NSNumber instanceMethodSignatureForSelector:@selector(init)];
    NSInvocation* invocatin=[NSInvocation invocationWithMethodSignature:sig];
    [invocatin setTarget:self];
    [invocatin setSelector:myMethod];
    [invocatin invoke];
}

-(void)myLog{
    NSLog(@"myLog");
}

@end

main.m代码

#import <Foundation/Foundation.h>
#import "invocation.h"


int main(int argc, const char * argv[]) {
    @autoreleasepool {

        [[[invocation alloc] init] invoker];

        }


    return 0;
}

如果要传递参数给消息时,代码如下:只改动了invocation.m代码

#import "invocation.h"

@implementation invocation

-(void)invoker{
    SEL myMethod=@selector(myLog:param:param:);
    NSMethodSignature *sig=[[self class] instanceMethodSignatureForSelector:myMethod];
    NSInvocation* invocatin=[NSInvocation invocationWithMethodSignature:sig];
    [invocatin setTarget:self];
    [invocatin setSelector:myMethod];
    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 param:(int)b param:(int)c{
    NSLog(@"myLog %d",a+b+c);
}

@end

上面代码中,setArgument方法设置参数的Index 需要从2开始,因为前两个被selector和target占用。

NSInvocation对象,是可以有返回值的,然而这个返回值,并不是其所调用函数的返回值,需要我们手动设置:

[invocatin setReturnValue:&c];
    int d;
    [invocatin getReturnValue:&d];
    NSLog(@"%d",d);

操作传递的都是地址。如果是OC对象,也是取地址。

NSInvocation、NSMethodSignature 的介绍及使用

在 iOS中可以直接调用 某个对象的消息 方式有2种 一种是performSelector:withObject: 再一种就是NSInvocation 第一种方式比较简单,能完成简单...
  • dztianyu
  • dztianyu
  • 2014年01月03日 16:22
  • 3380

NSInvocation动态调用任意block

http://www.wtoutiao.com/p/i7bspr.html 我们知道常规的block调用都是硬编码写死,参数类型必须在编译时匹配,编译器会转换成struct与C函数指针,...
  • jeffasd
  • jeffasd
  • 2016年06月03日 07:31
  • 534

使用NSInvocation 调用实例的方法,且等待获得返回值

    OBJCExternInterface * ibjInter = [[OBJCExternInterface alloc] init]; //定义类的实例     SEL theSelecto...
  • nitghost
  • nitghost
  • 2009年01月08日 10:41
  • 3553

NSInvocation简单用法

NSInvocation简单用法
  • lvdezhou
  • lvdezhou
  • 2016年02月16日 14:50
  • 655

NSInvocation的基本使用

一. NSInvocation简介 在iOS开发中,可以直接调用方法的方式有两种:performSelector:withObject: 和 NSInvocation。 performSelect...
  • SSIrreplaceable
  • SSIrreplaceable
  • 2016年11月28日 12:20
  • 2250

NSInvocation在获取返回值后crash问题

在使用NSInvocation的过程中,遇到一个问题。
  • zengconggen
  • zengconggen
  • 2014年07月21日 21:56
  • 3774

NSInvocation使用示例 IOS 对象方法的调用 NSInvocation PK performSelector

http://blog.csdn.net/yhawaii/article/details/8306637 一、概述 在 iOS中可以直接调用 某个对象的消息 方式有2种 第一种方式是使用...
  • jeffasd
  • jeffasd
  • 2016年06月03日 07:32
  • 515

OC-NSInvocation的简单运用

这篇文章摘要介绍了OC-NSInvocation的概念、作用、它使用步骤及使用时的注意事项,并给出了比较详细的范例。...
  • LSL_LSL1314
  • LSL_LSL1314
  • 2015年08月25日 22:07
  • 497

解决: void SendDelegateMessage(NSInvocation *): delegate (webView:decidePolicyForNavigationAction:requ

void SendDelegateMessage(NSInvocation *): delegate (webView:decidePolicyForNavigationAction:request:...
  • AckyiOSDeveloper
  • AckyiOSDeveloper
  • 2016年05月30日 10:38
  • 5479

关于NSInvocation-Tagert事件的多个参数实现方法

main.h [html] view plaincopy #import Foundation/Foundation.h>   #import "MyClass.h"    ...
  • shang1219178163
  • shang1219178163
  • 2015年01月12日 17:48
  • 473
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:NSInvocation类的学习
举报原因:
原因补充:

(最多只允许输入30个字)