zoukankan      html  css  js  c++  java
  • IOS NSInvocation用法简介

    IOS NSInvocation用法简介

    2012-10-25 19:59 来源:博客园 作者:csj007523 字号:T|T

    [摘要]在 iOS中可以直接调用某个对象的消息方式有两种,其中一种就是NSInvocation,本文介绍IOS NSInvocation用法,并提供简单的示例代码供参考。

    在 iOS中可以直接调用某个对象的消息方式有两种:

    一种是performSelector:withObject;

    再一种就是NSInvocation。

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

    main.h

    #import <Foundation/Foundation.h>
    #import "MyClass.h"
    
    int main (int argc, const char * argv[])
    {
    
        NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    
        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:);
        NSMethodSignature * sig = [[myClass class] 
                                   instanceMethodSignatureForSelector: mySelector];
        
        NSInvocation * myInvocation = [NSInvocation invocationWithMethodSignature: sig];
        [myInvocation setTarget: myClass];
        [myInvocation setSelector: mySelector];
        
        [myInvocation setArgument: &myString atIndex: 2];
        
        NSString * result = nil;    
        [myInvocation retainArguments];    
        [myInvocation invoke];
        [myInvocation getReturnValue: &result];
        NSLog(@"The NSInvocation invoke string is: %@", result);
    
        [myClass release];
        
        [pool drain];
        return 0;
    }

    MyClass.h

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

    MyClass.m

    1 #import "MyClass.h"
    2  
    3  
    4 @implementation MyClass
    5  
    6 - (id)init
    7 {
    8 self = [super init];
    9 if (self) {
    10 // Initialization code here.
    11 }
    12  
    13 return self;
    14 }
    15  
    16 - (NSString *)appendMyString:(NSString *)string
    17 {
    18 NSString *mString = [NSString stringWithFormat:@"%@ after append method", string];
    19  
    20 return mString;
    21 }
    22  
    23 - (void)dealloc
    24 {
    25 [super dealloc];
    26 }
    27  
    28 @end

    这里说明一下[myInvocation setArgument: &myString atIndex: 2];为什么index从2开始 ,原因为:0 1 两个参数已经被target 和selector占用。

    -------------以下为我对这三个方法的理解

    [myInvocation retainArguments];//如果方法还未执行,retainobject对象和方法下的所有参数对象

        [myInvocation invoke]; //执行方法

        [myInvocation getReturnValue: &result];//得到返回值

  • 相关阅读:
    redis应用场景
    使用Nginx+Lua+Redis构建灰度发布环境
    Comparison method violates its general contract
    mysql+redis
    缓存技术PK:选择Memcached还是Redis?
    缓存技术PK
    菜鸟教程之工具使用(九)——Git如何进行分支的merge操作
    菜鸟教程之工具使用(八)——EGit禁止自动转换回车换行符
    菜鸟教程之工具使用(七)——从GIt上导出Maven项目
    菜鸟教程之工具使用(六)——让Maven项目直接在eclipse内部的Tomcat中运行
  • 原文地址:https://www.cnblogs.com/wskgjmhh/p/4930063.html
Copyright © 2011-2022 走看看