码迷,mamicode.com
首页 > 其他好文 > 详细

类的成员变量和属性描述

时间:2016-03-24 18:31:49      阅读:249      评论:0      收藏:0      [点我收藏+]

标签:

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!