美文网首页
runtime使用篇: object_setIvar

runtime使用篇: object_setIvar

作者: 缔造福地 | 来源:发表于2016-12-16 20:10 被阅读242次
    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 刚初始化后就有值,上述方法同样正常有效。

    其他用法将在介绍 Class objc_allocateClassPair(Class superclass, const char *name, size_t extraBytes) 函数的使用时进行说明

    相关文章

      网友评论

          本文标题:runtime使用篇: object_setIvar

          本文链接:https://www.haomeiwen.com/subject/izvgmttx.html