void object_setIvar(id obj, Ivar ivar, id value)
說明:該函數(shù)的作用是將實(shí)例obj的實(shí)例變量ivar賦值為value
最簡單的用法
使用object_setIvar 函數(shù),首先需要一個(gè) Ivar 參數(shù),那么現(xiàn)在先創(chuàng)建一個(gè)類 Person ,在 Person.m 文件中的擴(kuò)展(extension)里給該類添加一個(gè)私有屬性 childhoodName ,代碼示例如下:
@interface Person ()
/** 小名 */
@property (nonatomic, weak) NSString *childhoodName;
@end
@implementation Person
@end
回到 ViewController.m 文件,通過運(yùn)用這篇中的知識先獲取到一個(gè) 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
打印結(jié)果如下:
runtime[48515:4990027] _childhoodName
因此 Ivar 就自然地通過下列代碼得到了:
Ivar ivar = class_getInstanceVariable([Person class], "_childhoodName"); // 7
僅僅通過 alloc init 初始化的 Person 實(shí)例 p 并沒有給 _childhoodName 實(shí)例變量賦值『說明』,因此下列代碼執(zhí)行后打印結(jié)果為空
Person *p = [[Person alloc] init]; // 8
id name = object_getIvar(p, ivar); // 9
NSLog(@"%@", name); // 10
打印結(jié)果如下:
runtime[48515:4990027] (null)
現(xiàn)在 Ivar 參數(shù)有了,嘗試使用 object_setIvar 函數(shù)對 Ivar 賦值,并打印賦值后的 Ivar 的值:
object_setIvar(p, ivar, @"蘋果");
id newName = object_getIvar(p, ivar);
NSLog(@"%@", newName);
打印結(jié)果如下:
runtime[48515:4990027] 蘋果
『說明』:如果 Person 實(shí)例 p 剛初始化后就有值,上述方法同樣正常有效。