前言
在开始之前建议先阅读iOS runtime的基础理解篇:iOS内功篇:runtime
有筒子在面试的时候,遇到这样一个问题:“你知道成员变量的本质是什么吗?”,筒子立马懵逼了,成员变量的本质?成员变量就是成员变量啊,平时只管用,还有什么更深层的含义?本文着重介绍runtime中成员变量和属性的定义和使用。
名词解析
成员变量
1、定义:
Ivar: 实例变量类型,是一个指向objc_ivar结构体的指针
1 |
typedef struct objc_ivar *Ivar; |
2、操作函数:
1 2 |
// 获取所有成员变量 class_copyIvarList |
1 2 |
// 获取成员变量名 ivar_getName |
1 2 |
// 获取成员变量类型编码 ivar_getTypeEncoding |
1 2 |
// 获取指定名称的成员变量 class_getInstanceVariable |
1 2 |
// 获取某个对象成员变量的值 object_getIvar |
1 2 |
// 设置某个对象成员变量的值 object_setIvar |
3、使用实例:
Model的头文件声明如下:
1 2 3 4 5 6 |
@interface Model : NSObject { NSString * _str1; } @property NSString * str2; @property (nonatomic, copy) NSDictionary * dict1; @end |
获取其成员变量:
1 2 3 4 5 6 7 8 9 |
unsigned int outCount = 0; Ivar * ivars = class_copyIvarList([Model class], &outCount); for (unsigned int i = 0; i < outCount; i ++) { Ivar ivar = ivars[i]; const char * name = ivar_getName(ivar); const char * type = ivar_getTypeEncoding(ivar); NSLog(@"类型为 %s 的 %s ",type, name); } free(ivars); |
打印结果: