标签:
0x 01 、类的属性 property
类的属性即是通过@property声明的属性。属性是类型为objc_property的一个结构体。该结构体封装了属性的信息 比如属性的名字,属性的类型,属性的可读写,非原子/原子属性等。
1)、获取一个类的属性列表方法:OBJC_EXPORT objc_property_t *class_copyPropertyList(Class cls, unsigned int *outCount)入参是一个类的class对象,一个是用于统计属性数量的整形数的地址。返回值是以objc_property_t对象为元素的一个属性列表数组。
2)、获取单个属性的名字:OBJC_EXPORT const char *property_getName(objc_property_t property) 入参是一个属性的结构体,返回值是一个const char*的字符串。
3)、获取单个属性的所有描述:OBJC_EXPORT const char *property_getAttributes(objc_property_t property) 入参同样是一个属性的结构体,返回值则是一个描述该属性所有特性的一个const char*的字符串。
4)、获取单个属性的值:OBJC_EXPORT char *property_copyAttributeValue(objc_property_t property, const char *attributeName)
__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_4_3)获取一个属性的当前值。
5)、获取一个属性所有描述的分组值:OBJC_EXPORT objc_property_attribute_t *property_copyAttributeList(objc_property_t property, unsigned int *outCount)
入参是属性的结构体和一个用于统计属性特性个数的整形数的地址。返回值则是一个由objc_property_attribute_t类型结构体为元素组成的一个数组。
比如有一个对象StudentModel:
1 @interface StudentModel : NSObject 2 { 3 NSString *_ivarOne; 4 UITextView *_ivarTwo; 5 UITextField *_ivarThree; 6 NSNumber *_ivarFour; 7 } 8 9 @property (nonatomic, copy) NSString *myName; 10 @property (nonatomic, assign) NSInteger myNumber; 11 @property (nonatomic, retain) NSString *myAge; 12 @property (nonatomic, weak) NSString *myFirstName; 13 @property (copy,readonly) NSArray *array; 14 @property (nonatomic, copy) NSMutableArray *mutableArray; 15 @property (nonatomic, strong) NSDictionary *dict; 16 @property (nonatomic, getter=isRight) BOOL right; 17 @property (nonatomic, setter=setLastname:) NSString *myLastName; 18 @property (nonatomic, strong) NSMutableDictionary *mutalbeDict; 19 @property (nonatomic, strong) NSCharacterSet *set; 20 @property (nonatomic, assign) NSInteger myInteger; 21 @property (nonatomic, assign) int myInt; 22 @property (nonatomic, assign) unsigned int myUnsignInt; 23 @property (nonatomic, assign) float myFloat; 24 @property (nonatomic, assign) double myDouble; 25 @property (nonatomic, assign) long myLong; 26 @property (nonatomic, assign) Point myPoint; 27 @property (nonatomic, assign) Rect myRect; 28 29 @end
用以下代码去获取对象StudentModel的属性列表:
1 unsigned int outCount ; 2 objc_property_t *propertyList = class_copyPropertyList([StudentModel class], &outCount);//获取类属性列表 3 for (unsigned int i = 0;i < outCount;i ++ ) 4 { 5 objc_property_t property = propertyList[i]; 6 const char *propertyName = property_getName(property);//获取属性的名字 7 const char *propertyDesc = property_getAttributes(property);//获取属性整体描述 8 const char *propertyValue = property_copyAttributeValue(property, propertyName);//获取属性的值 9 NSLog(@"\n\n%s 属性的描述是:%s ==== 值是:%s",propertyName,propertyDesc,propertyValue); 10 11 unsigned int attCount; 12 objc_property_attribute_t *attList = property_copyAttributeList(property, &attCount);//获取属性的描述列表,结果是一个类型为objc_property_attribute_t结构体组成的数组 13 for (unsigned int j = 0; j < attCount; j ++) { 14 objc_property_attribute_t att = attList[j]; 15 const char * name = att.name; 16 const char * value = att.value; 17 NSLog(@"%s 属性的名字是 %s 值是:%s",propertyName,name,value); 18 } 19 }
objc_property_attribute_t 结构体定义如下:
/// Defines a property attribute
typedef struct {
const char *name; /**< The name of the attribute */
const char *value; /**< The value of the attribute (usually empty) */
} objc_property_attribute_t;
代码的输入大概是这样的(挑一个myLastName属性输出为例子):
1 myLastName 属性的描述是:T@"NSString",&,N,SsetLastname:,V_myLastName ==== 值是:(null) 2 2016-03-24 16:36:20.393 FmdbTest[3656:2462138] myLastName 属性的名字是 T 值是:@"NSString" 3 2016-03-24 16:36:20.393 FmdbTest[3656:2462138] myLastName 属性的名字是 & 值是: 4 2016-03-24 16:36:20.393 FmdbTest[3656:2462138] myLastName 属性的名字是 N 值是: 5 2016-03-24 16:36:20.393 FmdbTest[3656:2462138] myLastName 属性的名字是 S 值是:setLastname: 6 2016-03-24 16:36:20.393 FmdbTest[3656:2462138] myLastName 属性的名字是 V 值是:_myLastName
objc_property_attribute_t 结构体的具体描述总结为下面几点:
a、name为T 表示属性的类型 类型为基本对象类型和基本数据类型,基本对象类型的value为该对象类型名字 如NSArray、NSString、NSMutableDictionary 等; 基本类型中: Bool为B、 NSInteger 为q、int为i、unsigned int为I、float为f、double为d、long也是q、Point为{Point=ss}、Rect为{Rect=ssss} 等等
b、name 为C 表示该属性为copy ;为&表示属性为strong;W表示属性为weak;空 表示属性为assgin ;以上value均为无值
c、原子属性 空表示原子属性;name 为N表示为非原子属性 ,表示原子和非原子属性的时候value为无值
d、name为V表示属性的名字 此时value为加了下划线的属性名字
e、name为R 表示只读属性readonly,此时value无值
f、name 为G表示设置getter方法 此时value为用户设定的getter方法名;name为S表示用户设置了setter方法,此时value为用户设置的setter方法
0x 02 、类的成员变量
类的成员变量包括了全局变量和类的属性。
1)、获取类成员变量的列表:OBJC_EXPORT Ivar *class_copyIvarList(Class cls, unsigned int *outCount) 入参为类名以及用于统计类的成员变量个数的整形数的地址,返回值为则Ivar结构体为元素的一个成员变量数组。
2)、获取单个成员变量的名字:OBJC_EXPORT const char *ivar_getName(Ivar v)
3)、获取单个成员变量的类型:OBJC_EXPORT const char *ivar_getTypeEncoding(Ivar v)
4)、获取单个成员变量在类中的内存偏移:OBJC_EXPORT ptrdiff_t ivar_getOffset(Ivar v)
如下代码 获取StudentModel类中的所有成员变量:
1 unsigned int ivarCount; 2 //获取类成员变量列表,包括类的属性property 3 Ivar *ivarList = class_copyIvarList([StudentModel class], &ivarCount); 4 for (unsigned int i = 0; i < ivarCount; i ++) { 5 //获取指定成员变量的名字 6 const char *ivarName = ivar_getName(ivarList[i]); 7 //获取成员变量的类型 类型参考property_copyAttributeList中name为T的值 8 const char *ivarTypeEncoding = ivar_getTypeEncoding(ivarList[i]); 9 //获取成员变量在类对象中的内存偏移值 10 ptrdiff_t ivarOffset = ivar_getOffset(ivarList[i]); 11 NSLog(@"ivarList[i]成员变量的名字是:%s,类型是:%s,偏移是:%td",ivarName,ivarTypeEncoding,ivarOffset); 12 }
代码的输出:
1 2016-03-24 16:36:20.397 FmdbTest[3656:2462138] ivarList[i]成员变量的名字是:_ivarOne,类型是:@"NSString",偏移是:8 2 2016-03-24 16:36:20.397 FmdbTest[3656:2462138] ivarList[i]成员变量的名字是:_ivarTwo,类型是:@"UITextView",偏移是:16 3 2016-03-24 16:36:20.397 FmdbTest[3656:2462138] ivarList[i]成员变量的名字是:_ivarThree,类型是:@"UITextField",偏移是:24 4 2016-03-24 16:36:20.397 FmdbTest[3656:2462138] ivarList[i]成员变量的名字是:_ivarFour,类型是:@"NSNumber",偏移是:32
成员变量的类型与0x01中的属性类型一样。参考上面即可
标签:
原文地址:http://www.cnblogs.com/yanyan1119/p/5316315.html