NSInvocation的基本用法

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

1.performSelector:withObject:                                         2.NSInvocation

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

@其实也是工作所使,原先只是知道,但没实际的用过,果然工作的时候才会实际的区去运用各个知识点.

//
//  HMTTest1.h
//  Created by HMT on 14-8-3.
//

#import <Foundation/Foundation.h>

@interface HMTTest1 : NSObject

- (NSString *)addTestString:(NSString *)testString;

@end

//
//  HMTTest1.m
//  Created by HMT on 14-8-3.
//

#import "HMTTest1.h"

@implementation HMTTest1

- (NSString *)addTestString:(NSString *)testString{

    NSString *string = [NSString stringWithFormat:@"这是一个关于%@的测试Demo", testString];

    return string;
}

@end

- (void)testOfNSInvocation{

    /*******************************normal方式*******************************/
    HMTTest1 *test1 = [[HMTTest1 alloc] init];
    NSString *normalString = [test1 addTestString:@"直接调用方法"];
    NSLog(@"normal = %@",normalString);
    NSLog(@"normal = %@",[test1 performSelector:@selector(addTestString:) withObject:@"performSelector:withObject"]);

    /*******************************NSInvocation方式*******************************/
    NSString *testString = @"haha";
    // 方法签名类,需要被调用消息所属的类HMTTest1 ,被调用的消息addTestString:
    NSMethodSignature *signature = [[HMTTest1 class] instanceMethodSignatureForSelector:@selector(addTestString:)];
    // 根据方法签名创建一个NSInvocation
    NSInvocation *myInvocation = [NSInvocation invocationWithMethodSignature:signature];
    // 设置调用者也就是HMTTest1的实例对象,也就是test1
    [myInvocation setTarget:test1];
    // 设置被调用的消息
    [myInvocation setSelector:@selector(addTestString:)];
    // 如果此消息有参数需要传入,参数是void*类型,需要注意的是atIndex的下标必须从2开始。原因为:0 1 两个参数已经被target 和selector占用
    //id(泛型对象)和void*(泛型指针)并非完全一样
    [myInvocation setArgument:&testString atIndex:2];
    // 定义接收结果的变量
    NSString *result = nil;
    // retain所有参数,防止参数被释放dealloc
    [myInvocation retainArguments];
    // 消息调用
    [myInvocation invoke];
    // 将得到的结果赋值给定义的变量
    [myInvocation getReturnValue: &result];
    NSLog(@"The NSInvocation invoke string is: %@", result);

//    //获得返回值类型
//    const char *returnType = signature.methodReturnType;
//    // 声明返回值变量
//    id returnValue;
//    // 如果没有返回值,也就是消息声明为void,那么returnValue=nil
//    if( !strcmp(returnType, @encode(void)) ){
//
//        returnValue =  nil;
//
//    }
//    // 如果返回值为对象,那么为变量赋值
//    else if( !strcmp(returnType, @encode(id)) ){
//
//        [myInvocation getReturnValue:&returnValue];
//
//    }
//    else{
//
//    }

    /*******************************@encode(aType) 可以返回该类型的 C 字符串(char *)的表示*******************************/
    NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES],@"key1",[NSNumber numberWithDouble:100.00f],@"key2",[NSNumber numberWithInt:200],@"key3",[NSNumber numberWithFloat:300.0f], @"key4", nil];
    for(NSString *key in dic){
        id value = [dic valueForKey:key];
        if([value isKindOfClass:[NSNumber class]]){
            const char * pObjCType = [((NSNumber*)value) objCType];
            if (strcmp(pObjCType, @encode(int))  == 0) {
                NSLog(@"字典中key=%@的值是int类型,值为%d",key,[value intValue]);
            }
            if (strcmp(pObjCType, @encode(float)) == 0) {
                NSLog(@"字典中key=%@的值是float类型,值为%f",key,[value floatValue]);
            }
            if (strcmp(pObjCType, @encode(double))  == 0) {
                NSLog(@"字典中key=%@的值是double类型,值为%f",key,[value doubleValue]);
            }
            if (strcmp(pObjCType, @encode(BOOL)) == 0) {
                NSLog(@"字典中key=%@的值是bool类型,值为%i",key,[value boolValue]);
            }
        }

    }

}

NSInvocation的基本用法,布布扣,bubuko.com

时间: 2024-10-12 20:13:37

NSInvocation的基本用法的相关文章

IOS NSInvocation用法简介

[摘要]在 iOS中可以直接调用某个对象的消息方式有两种,其中一种就是NSInvocation,本文介绍IOS NSInvocation用法,并提供简单的示例代码供参考. 在 iOS中可以直接调用某个对象的消息方式有两种: 一种是performSelector:withObject: 再一种就是NSInvocation. 第一种方式比较简单,能完成简单的调用.但是对于>2个的参数或者有返回值的处理,那就需要做些额外工作才能搞定.那么在这种情况下,我们就可以使用NSInvocation来进行这些相

NSMethodSignature和NSInvocation的用法

NSMethodSignature顾名思义应该就是“方法签名”,类似于C++中的编译器时的函数签名. 官方定义该类为对方法的参数.返回类似进行封装,协同NSInvocation实现消息转发. 通过消息转发可以用B实现A的方法.也是一种多重继承的解决方法. 在 iOS中可以直接调用 某个对象的消息 方式有2种 一种是performSelector:withObject: 再一种就是NSInvocation 第一种方式比较简单,能完成简单的调用.但是对于>2个的参数或者有返回值的处理,那就需要做些额

【转】IOS NSTimer 定时器用法总结

原文网址:http://my.oschina.net/u/2340880/blog/398598 NSTimer在IOS开发中会经常用到,尤其是小型游戏,然而对于初学者时常会注意不到其中的内存释放问题,将其基本用法总结如下: 一.初始化方法:有五种初始化方法,分别是 + (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti invocation:(NSInvocation *)invocation repeats:(BOOL)yesOrNo; -

NSTimer用法,暂停,继续,初始化

NSTimer用法,暂停,继续,初始化 转载:http://blog.csdn.net/zhuzhihai1988/article/details/7742881 NSTimer的使用方法 1.初始化 + (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)yesOrNo; + (NSTi

IOS NSTimer 定时器用法总结

NSTimer在IOS开发中会经常用到,尤其是小型游戏,然而对于初学者时常会注意不到其中的内存释放问题,将其基本用法总结如下: 一.初始化方法:有五种初始化方法,分别是 + (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti invocation:(NSInvocation *)invocation repeats:(BOOL)yesOrNo; - (void)viewDidLoad {     [super viewDidLoad];    

IOS NSInvocation应用与理解

IOS中有一个类型是SEL,它的作用很相似与函数指针,通过performSelector:withObject:函数可以直接调用这个消息.但是perform相关的这些函数,有一个局限性,其参数数量不能超过2个,否则要做很麻烦的处理,与之相对,NSInvocation也是一种消息调用的方法,并且它的参数没有限制.这两种直接调用对象消息的方法,在IOS4.0之后,大多被block结构所取代,只有在很老的兼容性系统中才会使用,简单用法总结如下: 一.初始化与调用 在官方文档中有明确说明,NSInvoc

js中获取时间new date()的用法

js中获取时间new date()的用法 获取时间:   var myDate = new Date();//获取系统当前时间 获取特定格式的时间: 1 myDate.getYear(); //获取当前年份(2位) 2 myDate.getFullYear(); //获取完整的年份(4位,1970-????) 3 myDate.getMonth(); //获取当前月份(0-11,0代表1月) 4 myDate.getDate(); //获取当前日(1-31) 5 myDate.getDay();

20.5 Shell脚本中的逻辑判断;20.6 文件目录属性判断;20.7 if特殊用法;20.8 20.9 cace判断(上下)

扩展: select用法 http://www.apelearn.com/bbs/thread-7950-1-1.html 20.5 Shell脚本中的逻辑判断 格式1:if 条件 ; then 语句; fi 1. 创建if1.sh测试脚本: [[email protected] ~]# vi if1.sh a=5,如果a大于3,满足这个条件,显示ok 添加内容: #!/bin/bash a=5 if [ $a -gt 3 ] then echo ok fi 2. 执行if1.sh脚本: [[e

20.1 Shell脚本介绍;20.2 Shell脚本结构和执行;20.3 date命令用法;20.4 Shell脚本中的变量

20.1 Shell脚本介绍 1. shell是一种脚本语言 aming_linux blog.lishiming.net 2. 可以使用逻辑判断.循环等语法 3. 可以自定义函数 4. shell是系统命令的集合 5. shell脚本可以实现自动化运维,能大大增加我们的运维效率 20.2 Shell脚本结构和执行 1. 开头(首行)需要加: #!/bin/bash 2. 以#开头的行作为解释说明: 3. 脚本的名字以.sh结尾,用于区分这是一个shell脚本 4. 执行.sh脚本方法有两种: