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
  • 相关阅读:
    谷歌浏览器调试按钮作用
    Android App罕见错误和优化方案
    cordova插件iOS平台实战开发注意点
    xcode8继续愉快的使用插件
    答CsdnBlogger问-关于VR取代安卓的问题
    答CsdnBlogger问-关于职业发展和团队管理问题
    答CsdnBlogger问-关于安卓入行和开发问题
    答CsdnBlogger问-关于定时和后台服务问题
    下载大图的demo by apple,值得研究和参考
    一个不错的mac软件下载站,mark一下 (商业使用请务必支持正版)
  • 原文地址:https://www.cnblogs.com/ablettchen/p/3968356.html
Copyright © 2011-2022 走看看