• IOS NSInvocation用法简介


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

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

    一种是performSelector:withObject;

    再一种就是NSInvocation。

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

    main.h

    1 #import <Foundation/Foundation.h>
    2 #import "MyClass.h"
    3  
    4 int main (int argc, const char * argv[])
    5 {
    6  
    7 NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    8  
    9 MyClass *myClass = [[MyClass alloc] init];
    10 NSString *myString = @"My string";
    11  
    12 //普通调用
    13 NSString *normalInvokeString = [myClass appendMyString:myString];
    14 NSLog(@"The normal invoke string is: %@", normalInvokeString);
    15  
    16 //NSInvocation调用
    17 SEL mySelector = @selector(appendMyString:);
    18 NSMethodSignature * sig = [[myClass class]
    19 instanceMethodSignatureForSelector: mySelector];
    20  
    21 NSInvocation * myInvocation = [NSInvocation invocationWithMethodSignature: sig];
    22 [myInvocation setTarget: myClass];
    23 [myInvocation setSelector: mySelector];
    24  
    25 [myInvocation setArgument: &myString atIndex: 2];
    26  
    27 NSString * result = nil;
    28 [myInvocation retainArguments];
    29 [myInvocation invoke];
    30 [myInvocation getReturnValue: &result];
    31 NSLog(@"The NSInvocation invoke string is: %@", result);
    32  
    33 [myClass release];
    34  
    35 [pool drain];
    36 return 0;
    37 }

    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占用。

  • 相关阅读:
    springmvc之SimpleUrlHandlerMapping非注解的方式实现url映射
    java之getMethods和getDeclaredMethods & Geoserver之ClassProperties
    geotools 21.2
    java之Method.invoke
    跟我学Python图像处理丨基于灰度三维图的图像顶帽运算和黑帽运算
    华为云SparkRTC面向低时延、大通量传输业务的技术探索
    浏览器、负载均衡 、进程内部层…那些你需要掌握的多级缓存
    家电上云后,智能家居如何构建场景化应用
    带你徒手完成基于MindSpore的CycleGAN实现
    二分查找:一种效率较高的查找方法
  • 原文地址:https://www.cnblogs.com/qq449832375/p/4690484.html
Copyright © 2020-2023  润新知