美文网首页
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

    void object_setIvar(id obj, Ivar ivar, id value) 说明:该函数的作...

  • iOS更改readonly值

    KVC、@synthesize、object_setIvar

  • Runtime实战使用篇

    概述 Objective-C Runtime是一个运行时库,它为Objective-C语言的动态属性提供支持,所有...

  • Runtime

    Runtime:运行时使用Runtime就是使用苹果提供的API使用Runtime可以实现OC无法实现的:1.使用...

  • runtime的用法

    1.使用runtime改变变量值 2.使用runtime交换方法 3.使用runtime添加方法 4.使用runt...

  • Runtime方法的使用—Class篇

    原文来自:Runtime方法的使用—Class篇感谢:xietao3 方法交换: 常用方法

  • iOS开发的一些小Tips

    用object_setIvar()给类的私有变量赋值@interface TestViewController (...

  • RunTime理解与实战(二)

    上一篇我们已经对OC的Runtime做了简单的介绍,了解的其原理和API的使用RunTime理解与实战(一),这篇...

  • 详讲Runtime方法交换(class_addMethod ,c

    前言 最近在整理博客,发现自己之前写的关于Runtime拦截替换方法的一篇文章《12- Runtime基础使用场景...

  • runTime常用方法

    使用runTime改变实例成员的值 使用runtime来交换两个方法 注意再次调用该方法不交换 使用runTime...

网友评论

      本文标题:runtime使用篇: object_setIvar

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