zoukankan      html  css  js  c++  java
  • Object c 反射

    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,如果属性比较多的话,就比较繁琐。
    但是如果用反射的话,就很容易了。
     
    View 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;
    }
  • 相关阅读:
    html5+css3中的background: -moz-linear-gradient 用法 (转载)
    CentOS 安装Apache服务
    Linux 笔记
    CURL 笔记
    Spring Application Context文件没有提示功能解决方法
    LeetCode 389. Find the Difference
    LeetCode 104. Maximum Depth of Binary Tree
    LeetCode 520. Detect Capital
    LeetCode 448. Find All Numbers Disappeared in an Array
    LeetCode 136. Single Number
  • 原文地址:https://www.cnblogs.com/likwo/p/2058134.html
Copyright © 2011-2022 走看看