ios培训之IOS NSInvocation用法

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

一种是performSelector:withObject:

再一种就是NSInvocation

第一种方式比较简单,能完成简单的调用。但是对于>2个的参数或者有返回值的处理,那就需要做些额外工作才能搞定。那么在这种情况下,我们就可以使用NSInvocation来进行这些相对复杂的*作
 
main.h
 
[html] view plaincopy 
#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
 
 
[html] view plaincopy 
#import <Foundation/Foundation.h>  
  
  
@inte***ce MyClass : NSObject {  
      
}  
  
- (NSString *)appendMyString:(NSString *)string;  
  
@end 

MyClass.m
 
 
[html] view plaincopy 
#import "MyClass.h"  
  
  
@implementation MyClass  
  
- (id)init  
{  
    self = [super init];  
    if (self) {  
        // Initialization code here.  
    }  
      
    return self;  
}  
  
- (NSString *)appendMyString:(NSString *)string  
{  
    NSString *mString = [NSString stringWithFormat:@"%@ after append method", string];  
      
    return mString;  
}  
  
- (void)dealloc  
{  
    [super dealloc];  
}  
  
@end  
 
      这里说明一下[myInvocation setArgument: &myString atIndex: 2];为什么index从2开始 ,原因为:0 1 两个参数已经被target 和selector占用

展开阅读全文

ios培训

12-05

rn传智播客-李明杰 职 务:项目经理、技术总监rn简 介:多年手机软件开发和教学经验,精通android和iOS平台的开发,学生都称李老师为"手机达人"。曾rn担任蓝源信息技术3G工作室的组长, 负责主导开发了装饰ERP系统手机端、服装连锁管理系统手机及平板客rn户端、自动鸡尾酒调酒机系统、网络斗地主RPG、蓝源游戏引擎等等,一致得到公司及客户的好评。后来在rn广州易热捷以架构师及技术总监的角色主持开发了8color形象管理软件第1、2个版本,帮助客户成功获得rn多家风投,并上了中央电视台《给你一个亿》节目(点击观看视频)。李老师不但具有丰富的软件开发经rn验、并且懂得如何把自己掌握的知识及技能传授给他人,曾给多家企业(如广州易方达等)提供Android、rniOS相关技术培训、及技术支持等服务,对学生认真负责、知识讲解耐心细致透彻,已经培养了接近上千名rnandroid及iOS程序员。rn引领技术潮流是传智播客师资团队一贯的追求。让传智学员永远走在当代IT人前端,让传智学员掌握实用的技术,先进的技术,让传智学员前瞻性的学习核心高级技术是传智培养高水平高薪学员的致胜法宝。以此为宗旨,传智播客推出iOS课程体系,该课程体系涵盖了iOS开发中各个层面的知识点,涉及应用和游戏开发,包括了快速上手指南、初级开发技巧以及高阶的开发教程。rnrnhttp://c.itcast.cn/?yxq1201qq 论坛

没有更多推荐了,返回首页