NSInvocation

main.m

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

    @autoreleasepool {

        /*
         在ios直接调用某个对象的消息是方法有两种:
         一:performselector:withObject:
         二:invocation

         第一种方式比较简单,能完成简单的调用。但是对于>2个的参数或者有返回值的处理,那就需要做些额外工作才能搞定。那么在这种情况下,我们就可以使用NSInvocation来进行这些相对复杂的操作

         NSInvocation可以处理参数、返回值。会java的人都知道凡是操作,其实NSInvocation就相当于反射操作。
         */

        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:);
        //方法签名类,需要被调用消息所属的类AsynInvoke ,被调用的消息appendMyString:
        NSMethodSignature * sig = [[myClass class] instanceMethodSignatureForSelector: mySelector];
        //根据方法签名创建一个NSInvocation
        NSInvocation * myInvocation = [NSInvocation invocationWithMethodSignature:sig];
        //设置调用者也就是MyClass的实例对象
        [myInvocation setTarget: myClass];
        //设置被调用的消息
        [myInvocation setSelector: mySelector];
        //如果此消息有参数需要传入,那么就需要按照如下方法进行参数设置,需要注意的是,atIndex的下标必须从2开始。原因为:0 1 两个参数已经被target 和selector占用
        [myInvocation setArgument:&myString atIndex:2];

        NSString * result = nil;
        //retain 所有参数,防止参数被释放dealloc
        [myInvocation retainArguments];
        //消息调用
        [myInvocation invoke];
        //为变量赋值
        [myInvocation getReturnValue: &result];
        NSLog(@"The NSInvocation invoke string is: %@", result);

    }
    return 0;
}

MyClass.h

1 #import <Foundation/Foundation.h>
2
3 @interface MyClass : NSObject
4 - (NSString *)appendMyString:(NSString *)string;
5 @end

MyClass.m

 1 #import "MyClass.h"
 2
 3 @implementation MyClass
 4 - (NSString *)appendMyString:(NSString *)string
 5 {
 6     NSString *mString = [NSString stringWithFormat:@"%@ after append method", string];
 7
 8     return mString;
 9 }
10 @end

时间: 2024-10-09 09:52:47

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

Invocation   调用的意思. 可想而知NSInvocation 是一个 方法调用 封装的类. 这体现了  面向对象的思想, 及一切皆对象.函数也不例外. 一般编程中,应该很少用到这个. 但是要编写 抽象度高的 框架,或 代码. 这个是必不可少的. 跟 c# , java 里的 反射 类似 . 动态访问 和 调用方法. 下面介绍下简单使用.. 用之前可以先 自己想下.如果让你 来 封装一个函数 作为一个类 ,都需要什么. funObj  函数 对象 funObj 属性 funObj 行为

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

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