• 类的成员变量和属性描述


    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(@"
    
    %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中的属性类型一样。参考上面即可

  • 相关阅读:
    flex 遍历Object或者JSON对象内容的实现代码
    Flex Vector使用(转)
    Flex——Array,ArrayCollection,Vector性能比较(转)
    SQLSERVER远程备份、恢复(转)
    隐藏Jquery dialog 按钮
    GSM 短信相关AT指令(转)
    SQL Server 父子迭代查询语句,树状查询(转)
    js framework comparation
    eventEmitter
    调试 shell script 方法
  • 原文地址:https://www.cnblogs.com/yanyan1119/p/5316315.html
Copyright © 2020-2023  润新知