runtime使用篇: Property相关

前言:
  • 本篇文章将介绍以下几个和 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_copyPropertyListclass_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 修饰的属性会自动生成前面带有下划线的成员变量(也会生成 setget 方法,见这篇)。

你可能感兴趣的:(runtime使用篇: Property相关)