iOS runtime方法详解之属性操作

来源:互联网 发布:淘宝脸部验证 编辑:程序博客网 时间:2024/06/05 04:30

方法声明:

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属性已经被替换成功;




0 0
原创粉丝点击