类的成员变量和属性描述
2016-03-24 17:13
253 查看
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:
用以下代码去获取对象StudentModel的属性列表:
/// 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属性输出为例子):
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类中的所有成员变量:
代码的输出:
成员变量的类型与0x01中的属性类型一样。参考上面即可
类的属性即是通过@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:
@interface StudentModel : NSObject { NSString *_ivarOne; UITextView *_ivarTwo; UITextField *_ivarThree; NSNumber *_ivarFour; } @property (nonatomic, copy) NSString *myName; @property (nonatomic, assign) NSInteger myNumber; @property (nonatomic, retain) NSString *myAge; @property (nonatomic, weak) NSString *myFirstName; @property (copy,readonly) NSArray *array; @property (nonatomic, copy) NSMutableArray *mutableArray; @property (nonatomic, strong) NSDictionary *dict; @property (nonatomic, getter=isRight) BOOL right; @property (nonatomic, setter=setLastname:) NSString *myLastName; @property (nonatomic, strong) NSMutableDictionary *mutalbeDict; @property (nonatomic, strong) NSCharacterSet *set; @property (nonatomic, assign) NSInteger myInteger; @property (nonatomic, assign) int myInt; @property (nonatomic, assign) unsigned int myUnsignInt; @property (nonatomic, assign) float myFloat; @property (nonatomic, assign) double myDouble; @property (nonatomic, assign) long myLong; @property (nonatomic, assign) Point myPoint; @property (nonatomic, assign) Rect myRect; @end
用以下代码去获取对象StudentModel的属性列表:
unsigned int outCount ; objc_property_t *propertyList = class_copyPropertyList([StudentModel class], &outCount);//获取类属性列表 for (unsigned int i = 0;i < outCount;i ++ ) { objc_property_t property = propertyList[i]; const char *propertyName = property_getName(property);//获取属性的名字 const char *propertyDesc = property_getAttributes(property);//获取属性整体描述 const char *propertyValue = property_copyAttributeValue(property, propertyName);//获取属性的值 NSLog(@"\n\n%s 属性的描述是:%s ==== 值是:%s",propertyName,propertyDesc,propertyValue); unsigned int attCount; objc_property_attribute_t *attList = property_copyAttributeList(property, &attCount);//获取属性的描述列表,结果是一个类型为objc_property_attribute_t结构体组成的数组 for (unsigned int j = 0; j < attCount; j ++) { objc_property_attribute_t att = attList[j]; const char * name = att.name; const char * value = att.value; NSLog(@"%s 属性的名字是 %s 值是:%s",propertyName,name,value); } } 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属性输出为例子):
myLastName 属性的描述是:T@"NSString",&,N,SsetLastname:,V_myLastName ==== 值是:(null) 2016-03-24 16:36:20.393 FmdbTest[3656:2462138] myLastName 属性的名字是 T 值是:@"NSString" 2016-03-24 16:36:20.393 FmdbTest[3656:2462138] myLastName 属性的名字是 & 值是: 2016-03-24 16:36:20.393 FmdbTest[3656:2462138] myLastName 属性的名字是 N 值是: 2016-03-24 16:36:20.393 FmdbTest[3656:2462138] myLastName 属性的名字是 S 值是:setLastname: 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类中的所有成员变量:
unsigned int ivarCount; //获取类成员变量列表,包括类的属性property Ivar *ivarList = class_copyIvarList([StudentModel class], &ivarCount); for (unsigned int i = 0; i < ivarCount; i ++) { //获取指定成员变量的名字 const char *ivarName = ivar_getName(ivarList[i]); //获取成员变量的类型 类型参考property_copyAttributeList中name为T的值 const char *ivarTypeEncoding = ivar_getTypeEncoding(ivarList[i]); //获取成员变量在类对象中的内存偏移值 ptrdiff_t ivarOffset = ivar_getOffset(ivarList[i]); NSLog(@"ivarList[i]成员变量的名字是:%s,类型是:%s,偏移是:%td",ivarName,ivarTypeEncoding,ivarOffset); }
代码的输出:
2016-03-24 16:36:20.397 FmdbTest[3656:2462138] ivarList[i]成员变量的名字是:_ivarOne,类型是:@"NSString",偏移是:8 2016-03-24 16:36:20.397 FmdbTest[3656:2462138] ivarList[i]成员变量的名字是:_ivarTwo,类型是:@"UITextView",偏移是:16 2016-03-24 16:36:20.397 FmdbTest[3656:2462138] ivarList[i]成员变量的名字是:_ivarThree,类型是:@"UITextField",偏移是:24 2016-03-24 16:36:20.397 FmdbTest[3656:2462138] ivarList[i]成员变量的名字是:_ivarFour,类型是:@"NSNumber",偏移是:32
成员变量的类型与0x01中的属性类型一样。参考上面即可
相关文章推荐
- SQLITE数据表主键设置Id自增方法
- 什么是版本控制 SVN subversion
- String equals方法的一些疑问
- java 在原有的excel模板上追加新数据
- Android中使用ScrollView嵌套ListView终极解决方案
- 虚拟文件系统中的数据结构(fs_struct、files_struct)
- Nyoj 素数环488
- 聊聊并发(二)——Java SE1.6中的Synchronized
- C++调用Lua函数
- 一个传统行业工作5年半“程序猿”的无奈!!!
- GPS坐标转百度地图并且加载地图示例.支持微信端访问
- 设计新Xlator扩展GlusterFS[转]
- UVALive 6555 Playing Fair with Cryptography(细节处理)
- 逆袭指数
- python 之 使用SQLite
- hdu1978 How many ways--DP/记忆化搜索DFS
- Android-通过自定义ViewPager(中间放大效果)
- TextView中ellipsize属性
- Android设计模式之单例模式
- 随笔:弱类型语言javascript中的 |与|| ,&与&&,左移,右移,异或分析