前言:
- 本篇文章将介绍以下几个和
Property
有关的runtime函数的使用:
objc_property_t class_getProperty(Class cls, const char *name)
const char *property_getName(objc_property_t property)
objc_property_t *class_copyPropertyList(Class cls, unsigned int *outCount)
1. objc_property_t class_getProperty(Class cls, const char *name)
作用:通过属性名获取属性
2. const char *property_getName(objc_property_t property)
作用:获取属性的名称
代码示例如下:
objc_property_t property_t = class_getProperty([UIImageView class], "animationImages");
const char *name = property_getName(property_t);
NSLog(@"%s", name); // animationImages
3. objc_property_t *class_copyPropertyList(Class cls, unsigned int *outCount)
作用:获取一个类的所有属性
以自定义类 Person
为例,以下为 Person
类中的代码:
// Person.h 文件
@interface Person : NSObject
/** name */
@property (nonatomic, copy) NSString *name;
/** age */
@property (nonatomic, assign) int age;
@end
// Person.m 文件
@interface Person ()
{
NSString *childhoodName;
int h;
}
/** 地址 */
@property (nonatomic, copy) NSString *address;
@end
现在用该函数获取 Person
类的所有属性,代码示例如下:
unsigned int propertyCount;
objc_property_t *propertyList = class_copyPropertyList([Person class], &propertyCount);
for (int i = 0; i < propertyCount; i++) {
objc_property_t property_t = propertyList[i];
NSLog(@"%s", property_getName(property_t));
}
free(propertyList);
打印结果如下:
runtime[2367:100961] name
runtime[2367:100961] age
runtime[2367:100961] address
获取到的正是 Person
类的所有属性(即用 @property
修饰的),即使是私有的属性也能获取到。
对比 class_copyPropertyList
和 class_copyIvarList
那该函数和这篇说到的 class_copyIvarList
函数有什么不同呢?现在同样以 Person
类为例,看看 class_copyIvarList
会获取到什么内容:
unsigned int ivarCount;
Ivar *ivarList = class_copyIvarList([Person class], &ivarCount);
for (int i = 0; i < ivarCount; i++) {
Ivar ivar = ivarList[i];
const char * name = ivar_getName(ivar);
NSLog(@"%s", name);
}
free(ivarList);
打印结果如下:
runtime[2570:106620] childhoodName
runtime[2570:106620] h
runtime[2570:106620] _age
runtime[2570:106620] _name
runtime[2570:106620] _address
可以看到,用 class_copyPropertyList
获取到的属性名称,用 class_copyIvarList
也能获取到,同时, class_copyIvarList
获取到的还有实例变量 childhoodName
和成员变量 h
。并且在所有属性名称前都有下划线 _
。这是因为:
@property
修饰的属性会自动生成前面带有下划线的成员变量(也会生成 set
和 get
方法,见这篇)。