void object_setIvar(id obj, Ivar ivar, id value)
说明:该函数的作用是将实例obj的实例变量ivar赋值为value
最简单的用法
使用object_setIvar
函数,首先需要一个 Ivar
参数,那么现在先创建一个类 Person
,在 Person.m
文件中的扩展(extension
)里给该类添加一个私有属性 childhoodName
,代码示例如下:
@interface Person ()
/** 小名 */
@property (nonatomic, weak) NSString *childhoodName;
@end
@implementation Person
@end
回到 ViewController.m
文件,通过运用这篇中的知识先获取到一个 Ivar
,代码示例如下:
unsigned int count; // 1
Ivar *ivars = class_copyIvarList([Person class], &count); // 2
for (int i = 0; i < count; i++) { // 3
Ivar ivar = ivars[i]; // 4
NSLog(@"%s", ivar_getName(ivar)); // 5
} // 6
打印结果如下:
runtime[48515:4990027] _childhoodName
因此 Ivar
就自然地通过下列代码得到了:
Ivar ivar = class_getInstanceVariable([Person class], "_childhoodName"); // 7
仅仅通过 alloc init
初始化的 Person
实例 p
并没有给 _childhoodName
实例变量赋值『说明』,因此下列代码执行后打印结果为空
Person *p = [[Person alloc] init]; // 8
id name = object_getIvar(p, ivar); // 9
NSLog(@"%@", name); // 10
打印结果如下:
runtime[48515:4990027] (null)
现在 Ivar
参数有了,尝试使用 object_setIvar
函数对 Ivar
赋值,并打印赋值后的 Ivar
的值:
object_setIvar(p, ivar, @"苹果");
id newName = object_getIvar(p, ivar);
NSLog(@"%@", newName);
打印结果如下:
runtime[48515:4990027] 苹果
『说明』:如果 Person
实例 p
刚初始化后就有值,上述方法同样正常有效。