zoukankan      html  css  js  c++  java
  • 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;
    }
    View Code

    MyClass.h

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

    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
    View Code
  • 相关阅读:
    thrift ssl 证书整理
    snmp学习笔记
    你必须了解的Session的本质
    安装大文件提示错误
    说说大型高并发高负载网站的系统架构(更新)
    【错误】未能找到类型或命名空间名称XXXX和未能解析引用的程序
    js调用后台代码的几种方式
    HTTP 错误 401.1
    万能的编程语言不要习惯性地把工具当作你天性缺陷的遮羞布
    PostgreSQL与MySQL比较
  • 原文地址:https://www.cnblogs.com/ablettchen/p/3968356.html
Copyright © 2011-2022 走看看