Object c也有和java相同的方法获取对象的属性列表方法,也就时反射了。

http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/ObjCRuntimeRef/Reference/reference.html


下面这段代码演示了如何获取类的属性相关信息

#import <objc/runtime.h>

#import <Foundation/Foundation.h>

unsigned int outCount, i;

objc_property_t *properties = class_copyPropertyList([UITouch class], &outCount);

for(i = 0; i < outCount; i++) {

objc_property_t property = properties[i];

fprintf(stdout, "%s %s\n", property_getName(property), property_getAttributes(property));

}

free(properties);



参考文档

http://stackoverflow.com/questions/754824/get-an-object-attributes-list-in-objective-c

反射在NSCoding里如何试用
NSCoding里如果要实现其协议的话,要定义很多Key,如果属性比较多的话,就比较繁琐。
但是如果用反射的话,就很容易了。

Object c 反射_取对象Object c 反射_取对象_02View Code

- (void)encodeWithCoder:(NSCoder*)coder

{

    Class clazz = [self class];

    u_int count;


    objc_property_t* properties = class_copyPropertyList(clazz, &count);

    NSMutableArray* propertyArray = [NSMutableArray arrayWithCapacity:count];

    for (int i = 0; i < count ; i++)

    {

        const char* propertyName = property_getName(properties[i]);

        [propertyArray addObject:[NSString  stringWithCString:propertyName encoding:NSUTF8StringEncoding]];

    }

    free(properties);



    for (NSString *name in propertyArray)

    {

        id value = [self valueForKey:name];

        [coder encodeObject:value forKey:name];

    }

}


- (id)initWithCoder:(NSCoder*)decoder

{

    if (self = [super init])

    {

        if (decoder == nil)

        {

            return self;

        }


        Class clazz = [self class];

        u_int count;


        objc_property_t* properties = class_copyPropertyList(clazz, &count);

        NSMutableArray* propertyArray = [NSMutableArray arrayWithCapacity:count];

        for (int i = 0; i < count ; i++)

        {

            const char* propertyName = property_getName(properties[i]);

            [propertyArray addObject:[NSString  stringWithCString:propertyName encoding:NSUTF8StringEncoding]];

        }

        free(properties);



        for (NSString *name in propertyArray)

        {

            id value = [decoder decodeObjectForKey:name];   

            [self setValue:value forKey:name];

        }

    }

    return self;

}