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属性已经被替换成功;
- iOS runtime方法详解之属性操作
- iOS runtime方法详解之类操作
- iOS runtime方法详解之对象关联
- iOS runtime方法详解之添加类
- iOS runtime方法详解之消息
- iOS runtime ~ objc_setAssociatedObject方法详解
- iOS开发之runtime详解
- iOS开发之runtime详解
- ios RunTime之方法交换
- iOS 开发 深入浅出Runtime运行时之方法动态处理(Dynamic Method Resolution)详解
- iOS为类别添加属性的方法(RunTime)
- iOS:UIScrollView方法 属性详解
- iOS:UITableView 方法 属性 详解
- iOS:UITableViewCell 方法 属性 详解
- runTime之属性关联
- runtime之@dynamic属性
- IOS开发之属性详解
- iOS runtime详解1
- iphone第九节:界面练习
- android socket通信
- Android Api Demos登顶之路(七十四)Graphics-->CreateBitmap
- 关于强制转换
- MFC之CString转换为int、long、char*
- iOS runtime方法详解之属性操作
- 二级指针和野指针
- Windows-svchost.exe大量占用内存
- Xcode6以后mac中iOS模拟器安装路径以及程序沙箱路径
- postgres学习问题之select语句
- UIAutomator源码分析之启动和运行
- html中的图片格式
- Struts2:过滤器和拦截器的区别
- 常见的排序算法