NSInvocation简单使用 和 @encode方法的简单使用
2012-10-19 13:40
465 查看
在 iOS中可以直接调用 某个对象的消息 方式有2种
一种是performSelector:withObject:
再一种就是NSInvocation
第一种方式比较简单,能完成简单的调用。但是对于>2个的参数或者有返回值的处理,那就需要做些额外工作才能搞定。那么在这种情况下,我们就可以使用NSInvocation来进行这些相对复杂的操作
NSInvocation可以处理参数、返回值。会java的人都知道凡是操作,其实NSInvocation就相当于反射操作。
下面这个例子描述了如何使用NSInvocation,上代码:
AppDelegate类的.m文件
1、添加头文件
#import "MyClass.h"
2、在应用启动方法中添加代码:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary
*)launchOptions {
// Override point for customization after application launch.
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
instanceMethodSignatureForSelector: mySelector];
//获得返回值类型
const char *returnType = sig.methodReturnType;
//判断返回值类型是不是NSString
if(strcmp(returnType,
@encode(NSString *)) ==
0)
{
NSLog(@"the returnType is NSString * and returnType is @");
//注意,returnType并不是NSString *
而是@,当然@encode(NSString *)的值也是@
//这是因为:
//为了更好的互操作性,Objective-C
的数据类型,甚至自定义类型、函数或方法的元类型,都可以使用 ASCII
编码。@encode(aType) 可以返回该类型的 C
字符串(char *)的表示
//比如 @encode(int)的值是i;@encode(MyClass)是
{MyClass=#};@encode(void)是 v;@encode(id)也是 @;@encode(NSString)也是
{NSString=#};@encode(void *)是 ^v
}
NSInvocation * myInvocation = [NSInvocation
invocationWithMethodSignature: sig];
//设置调用者也就是AsynInvoked的实例对象
[myInvocation
setTarget:myClass];
//设置被调用的方法
[myInvocation
setSelector:mySelector];
//如果此消息有参数需要传入,那么就需要按照如下方法进行参数设置,需要注意的是,atIndex的下标必须从2开始。原因为:0
1 两个参数已经被target 和selector占用
//&myString是指向指针myString的指针
[myInvocation
setArgument:&myString
atIndex: 2];
//retain
所有参数,防止参数被释放dealloc
[myInvocation
retainArguments];
//方法调用
[myInvocation
invoke];
//声明返回值变量
NSString * result =
nil;
//如果返回值为对象,那么为变量赋值
[myInvocation
getReturnValue: &result];
//&result是指向指针result的指针
NSLog(@"The NSInvocation invoke string is: %@", result);
/*
//也可以通过得到返回值的长度,根据长度申请内存空间,然后赋值
//返回值长度,可以根据该值为返回的值创建内存空间
NSUInteger length = [sig methodReturnLength];
//根据长度申请内存
void *buffer = (void *)malloc(length);
//为变量赋值
[myInvocation getReturnValue:buffer];
*/
[myClass
release];
return
YES;
}
创建MyClass类的.h和.m文件
1、MyClass.h文件
#import <Foundation/Foundation.h>
@interface MyClass :
NSObject
{
}
- (NSString *)appendMyString:(NSString *)string;
@end
2、MyClass.m文件
#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
以上,代码可以运行了,祝你好运
一种是performSelector:withObject:
再一种就是NSInvocation
第一种方式比较简单,能完成简单的调用。但是对于>2个的参数或者有返回值的处理,那就需要做些额外工作才能搞定。那么在这种情况下,我们就可以使用NSInvocation来进行这些相对复杂的操作
NSInvocation可以处理参数、返回值。会java的人都知道凡是操作,其实NSInvocation就相当于反射操作。
下面这个例子描述了如何使用NSInvocation,上代码:
AppDelegate类的.m文件
1、添加头文件
#import "MyClass.h"
2、在应用启动方法中添加代码:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary
*)launchOptions {
// Override point for customization after application launch.
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
instanceMethodSignatureForSelector: mySelector];
//获得返回值类型
const char *returnType = sig.methodReturnType;
//判断返回值类型是不是NSString
if(strcmp(returnType,
@encode(NSString *)) ==
0)
{
NSLog(@"the returnType is NSString * and returnType is @");
//注意,returnType并不是NSString *
而是@,当然@encode(NSString *)的值也是@
//这是因为:
//为了更好的互操作性,Objective-C
的数据类型,甚至自定义类型、函数或方法的元类型,都可以使用 ASCII
编码。@encode(aType) 可以返回该类型的 C
字符串(char *)的表示
//比如 @encode(int)的值是i;@encode(MyClass)是
{MyClass=#};@encode(void)是 v;@encode(id)也是 @;@encode(NSString)也是
{NSString=#};@encode(void *)是 ^v
}
NSInvocation * myInvocation = [NSInvocation
invocationWithMethodSignature: sig];
//设置调用者也就是AsynInvoked的实例对象
[myInvocation
setTarget:myClass];
//设置被调用的方法
[myInvocation
setSelector:mySelector];
//如果此消息有参数需要传入,那么就需要按照如下方法进行参数设置,需要注意的是,atIndex的下标必须从2开始。原因为:0
1 两个参数已经被target 和selector占用
//&myString是指向指针myString的指针
[myInvocation
setArgument:&myString
atIndex: 2];
//retain
所有参数,防止参数被释放dealloc
[myInvocation
retainArguments];
//方法调用
[myInvocation
invoke];
//声明返回值变量
NSString * result =
nil;
//如果返回值为对象,那么为变量赋值
[myInvocation
getReturnValue: &result];
//&result是指向指针result的指针
NSLog(@"The NSInvocation invoke string is: %@", result);
/*
//也可以通过得到返回值的长度,根据长度申请内存空间,然后赋值
//返回值长度,可以根据该值为返回的值创建内存空间
NSUInteger length = [sig methodReturnLength];
//根据长度申请内存
void *buffer = (void *)malloc(length);
//为变量赋值
[myInvocation getReturnValue:buffer];
*/
[myClass
release];
return
YES;
}
创建MyClass类的.h和.m文件
1、MyClass.h文件
#import <Foundation/Foundation.h>
@interface MyClass :
NSObject
{
}
- (NSString *)appendMyString:(NSString *)string;
@end
2、MyClass.m文件
#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
以上,代码可以运行了,祝你好运
相关文章推荐
- NSInvocation简单使用 调用方法
- go语言日志记录库简单使用方法实例分析
- 【drp 11】使用Junit简单测试接口方法
- Qt QStringList的简单使用方法
- PHP在浏览器上跟踪调试的方法以及使用ChromePhp、FirePHP的简单介绍
- WebKit.net最简单使用方法
- Asp.Net使用POST方法最简单的实现
- [置顶] SpringBoot 最简单的日志使用方法
- 如何使用最简单的方法将一个已经存在的工程中使用 cocaPodfile
- 使用CSS实现图片分割效果的简单方法介绍
- VC++开发中最简单的Multi-Byte(ANSI)和Unicode互转方法,灵活使用Windows基本API:wsprintfA, wsprintfW
- 结合实例详细介绍encodeURI()、encodeURIComponent()、decodeURI()、decodeURIComponent()使用方法
- 简单易懂的Cocoapods的安装和使用方法
- Android开发中SQLite的简单使用方法
- cocoapods简单实用的使用方法
- web.config文件自定义配置节的使用方法的一个简单例子
- PHP使用mysqli操作MySQL数据库的简单方法
- javascript中encodeURI和decodeURI方法使用介绍
- CProgressCtrl 进度条控件的使用方法简单介绍
- .net 多播委托的使用方法以及场景,更简单的观察者模式