您的位置:首页 > 移动开发 > Objective-C

object c++如何实现反射机制

2012-12-20 11:12 405 查看

object c++如何实现反射机制

博客分类:
iphone

object c++如何实现反射机制

开发语言的反射机制为我们提供了发挥想象力的基础,通过反射可以设计出各种5花8门的架构来。

参考网上各种资料,Object c++的反射主要依靠下面的2个函数。

NSClassFromString

NSSelectorFromString

下面直接摆上例子,一目了然。

(一)通过一个字符串来创建对象并调用对象中的方法。

文件:Member.h

Cpp代码


// Member.h
#import <Foundation/Foundation.h>

@interface Member : NSObject {
NSString *name;
int age;
}

@property (nonatomic,copy) NSString *name;
@property int age;

@end

文件Member.m

Cpp代码


// Member.m
#import "Member.h"

@implementation Member

@synthesize name,age;

@end

测试代码文件Sample01.m:

Cpp代码


#import <Foundation/Foundation.h>

int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

//定义类名
NSString *className=@"Member";
//定义方法名
//注意:方法名后面要根据参数来设置,这里的setName:,表示setName
// 方法后面有1个参数
NSString *methodName=@"setName:";

//取得类并分配内存和初始化
id obj=[[NSClassFromString(className) alloc] init];
//调用类方法
[obj performSelector: NSSelectorFromString(methodName) withObject:@"Tom and Jerry."];
//显示
NSLog(@"%@",[obj name]);

[pool drain];
return 0;
}

代码执行后,显示如下:

2012-03-16 17:41:31.962 Sample01[39762:1307] Tom and Jerry.

由上面例子发现:

(1)在反射时,不需要使用import引入要反射的类;

(2)在定义反射类方法名时要注意后面的冒号,必须根据参数数量和原类方法名设置。

(二)通过字符串获取类的全部属性。

对上面的例子进行调整,如下面代码:(注意:在头部要引入头文件 objc/runtime.h)

Cpp代码


#import <Foundation/Foundation.h>
#import <objc/runtime.h>

int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

//定义类名
NSString *className=@"Member";
//定义方法名
//注意:方法名后面要根据参数来设置,这里的setName:,表示setName
// 方法后面有1个参数
NSString *methodName=@"setName:";

//取得类并分配内存和初始化
id obj=[[NSClassFromString(className) alloc] init];
//调用类方法
[obj performSelector: NSSelectorFromString(methodName) withObject:@"Tom and Jerry."];
//显示
NSLog(@"%@",[obj name]);

//定义类属性的数量
unsigned propertyCount;
//获取对象的全部属性并循环显示属性名称和属性特性参数
objc_property_t *properties = class_copyPropertyList([obj class],&propertyCount);
for(int i=0;i<propertyCount;i++){
objc_property_t prop=properties[i];
NSLog(@"property:%s",property_getName(prop));
NSLog(@"property_getAttributes:%s",property_getAttributes(prop));
}

[pool drain];
return 0;
}

代码执行后,显示结果如下:

2012-03-19 16:40:04.345 Sample01[41713:1307] Tom and Jerry.

2012-03-19 16:40:04.350 Sample01[41713:1307] property:age

2012-03-19 16:40:04.352 Sample01[41713:1307] property_getAttributes:Ti,Vage

2012-03-19 16:40:04.354 Sample01[41713:1307] property:name

2012-03-19 16:40:04.355 Sample01[41713:1307] property_getAttributes:T@"NSString",C,N,Vname

关于属性的特性参数可以参考官方文档说明:


Property Type String

You can use the
property_getAttributes
function to discover the name, the
@encode
type string of a property, and other attributes of the property.
The string starts with a
T
followed by the
@encode
type and a comma, and finishes with a
V
followed
by the name of the backing instance variable. Between these, the attributes are specified by the following descriptors, separated by commas:

Table 7-1 Declared property type encodings
Code
Meaning
R

The property is read-only (
readonly
).
C

The property is a copy of the value last assigned (
copy
).
&

The property is a reference to the value last assigned (
retain
).
N

The property is non-atomic (
nonatomic
).
G<name>

The property defines a custom getter selector name. The name follows the
G
(for example,
GcustomGetter,
).
S<name>

The property defines a custom setter selector name. The name follows the
S
(for example,
ScustomSetter:,
).
D

The property is dynamic (
@dynamic
).
W

The property is a weak reference (
__weak
).
P

The property is eligible for garbage collection.
t<encoding>

Specifies the type using old-style encoding.

from /article/6914883.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: