关于 NSInvocation

Invocation   调用的意思。

可想而知NSInvocation 是一个 方法调用 封装的类。

这体现了  面向对象的思想, 及一切皆对象。函数也不例外。

一般编程中,应该很少用到这个。 但是要编写 抽象度高的 框架,或 代码。 这个是必不可少的。

跟 c# , java 里的 反射 类似 。 动态访问 和 调用方法。

下面介绍下简单使用。。

用之前可以先 自己想下。如果让你 来 封装一个函数 作为一个类 ,都需要什么。

funObj  函数 对象

funObj 属性

funObj 行为(方法fun)

首先属性,需要 函数的一个描述:

{

1,唯一标示 一个函数

2,函数 在 程序里的 调用指针。

}

函数的参数:

{

arg 1

arg 2

}

函数的返回值:

{

returnValue

}

函数的调用对象

{

要调用方法的外部对象。

}

其次   函数对象的行为(fun)

{

有了足够多的信息后,我们就可以 拿到 外部调用对象 去 内存里找 函数的调用地址, 加上函数参数、返回值。 来调用函数。

}

以上这些,在面向对象的语言里 可能已经为我们封装了,OC 中的NSInvocation 就是。

对于调用一个 有两个参数以上的   函数,我们可以这样:

-( id )fun :(id) a :(id)b ......{

}

[self    fun:a : b .....]; //很简单啊。这是在确定的情况下。不确定呢,

使用

[self performSelector:@selector() withObject: .....];

很遗憾 只能传递一个参数, 除非你把 a,b 参数放倒一个  集合中。 

使用NSInvocation 
-(NSString *)customMethod:(NSString *)arg1 otherArg:(NSString *)arg2{

    return [NSString stringWithFormat:@"%@%@",arg1,arg2];

}

    SEL customSel = @selector(customMethod: otherArg:);

    NSMethodSignature * customSig = [self methodSignatureForSelector:customSel];

    NSInvocation *customInvocation =  [NSInvocation  invocationWithMethodSignature:customSig ];
    NSString *arg1 = @"NS";
    NSString *arg2 = @"Invocation";

    [customInvocation setTarget:self];
    [customInvocation setReturnValue:@encode(NSString)];

    [customInvocation setSelector:customSel];
    [customInvocation setArgument:&arg1 atIndex:2];
    [customInvocation setArgument:&arg2 atIndex:3];

    [customInvocation invoke];

SEL customSel = @selector(customMethod: otherArg:);

 
时间: 2024-08-02 05:47:13

关于 NSInvocation的相关文章

转载 NSInvocation使用

在 iOS中可以直接调用 某个对象的消息 方式有2中 一种是performSelector:withObject: 再一种就是NSInvocation 第一种方式比较简单,能完成简单的调用.但是对于>2个的参数或者有返回值的处理,那就需要做些额外工作才能搞定.那么在这种情况下,我们就可以使用NSInvocation来进行这些相对复杂的操作 NSInvocation可以处理参数.返回值.会java的人都知道凡是操作,其实NSInvocation就相当于反射操作. 下面这个例子描述了如何使用NSIn

NSInvocation的基本用法

@在 iOS中可以直接调用某个对象的消息方式有2种: 1.performSelector:withObject:                                         2.NSInvocation 第一种方式比较简单,能完成简单的调用.但是对于>2个的参数或者有返回值的处理,那就需要做些额外工作才能搞定.那么在这种情况下,我们就可以使用NSInvocation来进行这些相对复杂的操作. @其实也是工作所使,原先只是知道,但没实际的用过,果然工作的时候才会实际的区去运用各

Objective-C中NSInvocation的使用

OC中调用方法某个对象的消息呦两种方式: #1. performanceSelector: withObject: #2. NSInvocation. 第一个PerformaceSelector比较常用, 也比较简单. 但是这个方式最多只能传递2个参数 当需要2个以上参数时就只能用NSInvocation了 直接上代码吧, 会注释清楚 - (void)viewDidLoad { [super viewDidLoad]; //用performanceSelector调用三个参数的方法, 但只传递2

iOS 反射函数: performSelector 和 NSInvocation

当我们有方法名和参数列表,想要动态地给对象发送消息,可用通过反射函数机制来实现,有两种常用的做法: 一.performSelector 1 - (id)performSelector:(SEL)aSelector; 2 - (id)performSelector:(SEL)aSelector withObject:(id)object; 3 - (id)performSelector:(SEL)aSelector withObject:(id)object1 withObject:(id)obj

IOS NSInvocation用法简介

[摘要]在 iOS中可以直接调用某个对象的消息方式有两种,其中一种就是NSInvocation,本文介绍IOS NSInvocation用法,并提供简单的示例代码供参考. 在 iOS中可以直接调用某个对象的消息方式有两种: 一种是performSelector:withObject: 再一种就是NSInvocation. 第一种方式比较简单,能完成简单的调用.但是对于>2个的参数或者有返回值的处理,那就需要做些额外工作才能搞定.那么在这种情况下,我们就可以使用NSInvocation来进行这些相

NSMethodSignature和NSInvocation的使用(方法传多参数)

动态调用方法时会用到,例子 -(NSString *)myMethod:(NSString *)param1 withParam2:(NSNumber *)param2 {     NSString *result = @"objc";     NSLog(@"par = %@",param1);     NSLog(@"par 2 = %@",param2);     return result; } -(void)invokeMyMethod

NSInvocation的使用

在iOS中可以直接调用某个对象的消息,有几种方法: 1. 直接使用该对象进行调用: 2. 可以使用performSelector: withObject; 3. 可以使用NSInvoke来调用. 方法2以及方法3两种方法的区别在于:方法3可以适用于在方法中存在多个参数,以及需要使用该方法的返回值的时候. 使用NSInvoke的方法需要注意: (1) 传入参数需要从下标2开始,第一个参数用于传入调用的对象 (2) 需要查看返回值类型的时候需要使用NSInvocation中的属性中的methodSi

NSInvocation

main.m int main(int argc, const char * argv[]) { @autoreleasepool { /* 在ios直接调用某个对象的消息是方法有两种: 一:performselector:withObject: 二:invocation 第一种方式比较简单,能完成简单的调用.但是对于>2个的参数或者有返回值的处理,那就需要做些额外工作才能搞定.那么在这种情况下,我们就可以使用NSInvocation来进行这些相对复杂的操作 NSInvocation可以处理参数

利用NSInvocation对方法进行抽象,实现对方法的加锁

我们在实际开发中需要对离散的方式加锁实现线程安全,当然我们有多种实现方式,这只是其中一种,使用起来比较方便 + (id)performSelectorWithTarget:(id)target selector:(SEL)selector withObject:(id)arg1 ,...NS_REQUIRES_NIL_TERMINATION; { @synchronized(self){ id result = nil; NSMethodSignature *sig = [target meth