iOS runtime方法详解之属性操作

方法声明:

objc_property_t class_getProperty ( Class cls, const char *name );

描述:返回给定类的指定名称的属性的描述信息;返回的objc_property_t类型的内容通过property_getName,property_getAttributes,property_copyAttributeValue,property_copyAttributeList方法查看


方法声明:

objc_property_t * class_copyPropertyList ( Class cls, unsigned int *outCount );

描述:

cls

需要操作的类

outCount

输出指针,指明返回objc_property_t类型数组的大小

返回objc_property_t类型的数组,每个objc_property_t描述一个属性的信息,这个数组中不会包括超类的属性;最后使用完以后,你需要自己通过free方法释放掉这个数组


方法声明:

BOOL class_addProperty ( Class cls, const char *name, const objc_property_attribute_t*attributes, unsigned int attributeCount );

描述:给类添加一个属性

cls

要修改的类

name

属性的名称

attributes

属性相关特性的数组

attributeCount

数组attributes的个数

如果添加成功则返回YES,添加失败(例如添加的属性已经存在)则返回NO;


方法声明:

void class_replaceProperty ( Class cls, const char *name, const objc_property_attribute_t*attributes, unsigned int attributeCount );

描述:替换类的一个属性

cls

要修改的类

name

属性的名称

attributes

属性相关特性的数组

attributeCount

数组attributes的个数

方法声明:

const char * property_getName ( objc_property_t property );

描述:返回属性描述信息中的属性名称的c字符串


方法声明:

const char * property_getAttributes ( objc_property_t property );

描述:返回属性描述信息中的属性特性的c字符串


方法声明:

char * property_copyAttributeValue ( objc_property_t property, const char *attributeName );

描述:返回属性描述信息中的属性特性名称为attributeName的c字符串,返回的字符串使用完以后需要自己通过free方法释放掉;


方法声明:

objc_property_attribute_t * property_copyAttributeList ( objc_property_t property, unsignedint *outCount );

描述:获取属性的特性的数组,数组的个数会返回给输出指针outCount,返回的数组使用完以后需要自己通过free方法释放掉;

举例:

@interface Book : BaseModel
{
    @private
    NSString* _privateName;

}
@property (strong, nonatomic) NSString *author;
@property (assign, nonatomic) NSUInteger pages;
@property (strong, nonatomic) Pen *pen;

+ (void)ClassMethod;
- (void)InstanceMethod;

@end

    Class cls = [Book class];

    unsigned int ivarsCnt = 0;
    objc_property_t property = class_getProperty( cls, "author" );
    NSLog(@"property:%s,%s", property_getName(property),property_getAttributes(property));
//    获取author属性的特征信息列表
    objc_property_attribute_t *attributes = property_copyAttributeList(property, &ivarsCnt);
    
    for (objc_property_attribute_t *p = attributes; p < attributes + ivarsCnt; p++)
    {
        objc_property_attribute_t attribute = *p;
        NSLog(@"name: %s value: %s", attribute.name,attribute.value);
        char* value = property_copyAttributeValue ( property, attribute.name );
        NSLog(@"value: %s ", value);
        free(value);
    }  
    free(attributes);

打印信息:

2015-09-21 10:09:20.482 AppTest[4029:56317] property:author,T@"NSString",&,N,V_author

2015-09-21 10:09:20.482 AppTest[4029:56317] name: T value: @"NSString"

2015-09-21 10:09:20.483 AppTest[4029:56317] value: @"NSString" 

2015-09-21 10:09:20.483 AppTest[4029:56317] name: & value: 

2015-09-21 10:09:20.483 AppTest[4029:56317] value:  

2015-09-21 10:09:20.483 AppTest[4029:56317] name: N value: 

2015-09-21 10:09:20.483 AppTest[4029:56317] value:  

2015-09-21 10:09:20.483 AppTest[4029:56317] name: V value: _author

2015-09-21 10:09:20.483 AppTest[4029:56317] value: _author 

说明:

属性的特性是固定格式,以逗号隔开,通常是T@"类型"开头,V_属性名称结尾的格式,中间的参考表


举例:

    Class cls = [Book class];
    
    objc_property_attribute_t attr0 = { "T", "@\"NSArray\"" };
    objc_property_attribute_t attr1 = { "&", "" };
    objc_property_attribute_t attr2 = { "N", "" };
    objc_property_attribute_t attr3  = { "V", "newProperty" };
    objc_property_attribute_t attrs[] = { attr0, attr1, attr2,attr3 };
//    添加一个名字为newProperty的NSArray类型的属性
    BOOL ret = class_addProperty ( cls, "newProperty", attrs, 4 );
    if (ret) {
        //    获取所以属性的列表
        unsigned int count;
        objc_property_t *properties = class_copyPropertyList(cls, &count);
        for(int i = 0; i < count; i++)
        {
            objc_property_t property = properties[i];
            
            NSLog(@"name:%s",property_getName(property));
            NSLog(@"attributes:%s",property_getAttributes(property));
            
        }
        free(properties);
        
    }
打印信息:

2015-09-21 10:21:42.141 AppTest[4449:62700] name:newProperty

2015-09-21 10:21:42.142 AppTest[4449:62700] attributes:T@"NSArray",&,N,VnewProperty

2015-09-21 10:21:42.142 AppTest[4449:62700] name:author

2015-09-21 10:21:42.142 AppTest[4449:62700] attributes:T@"NSString",&,N,V_author

2015-09-21 10:21:42.142 AppTest[4449:62700] name:pages

2015-09-21 10:21:42.142 AppTest[4449:62700] attributes:TQ,N,V_pages

2015-09-21 10:21:42.142 AppTest[4449:62700] name:pen

2015-09-21 10:21:42.143 AppTest[4449:62700] attributes:T@"Pen",&,N,V_pen

说明:

从打印信息看出我们的新属性已经添加成功;


举例:

    Class cls = [Book class];
    
    objc_property_attribute_t attr0_ = { "T", "@\"NSArray\"" };
    objc_property_attribute_t attr1_ = { "&", "" };
    objc_property_attribute_t attr2_ = { "N", "" };
    objc_property_attribute_t attr3_  = { "V", "author" };
    objc_property_attribute_t attrs_[] = { attr0_, attr1_, attr2_,attr3_ };
    class_replaceProperty ( cls, "author", attrs_, 4 );
//    替换现有的author属性的类型为数组类型
    unsigned int count;
    objc_property_t *properties = class_copyPropertyList(cls, &count);
    for(int i = 0; i < count; i++)
    {
        objc_property_t property = properties[i];
        
        NSLog(@"name:%s",property_getName(property));
        NSLog(@"attributes:%s",property_getAttributes(property));
        
    }
    free(properties);

打印信息:

2015-09-21 10:24:13.236 AppTest[4555:64798] name:author

2015-09-21 10:24:13.237 AppTest[4555:64798] attributes:T@"NSArray",&,N,Vauthor

2015-09-21 10:24:13.237 AppTest[4555:64798] name:pages

2015-09-21 10:24:13.237 AppTest[4555:64798] attributes:TQ,N,V_pages

2015-09-21 10:24:13.237 AppTest[4555:64798] name:pen

2015-09-21 10:24:13.237 AppTest[4555:64798] attributes:T@"Pen",&,N,V_pen

说明:

从打印信息看出我们的author属性已经被替换成功;




你可能感兴趣的:(Runtime)