runtime-API-object

1. Class object_getClass(id obj)

獲取isa指向的class

  NSPerson *person = [[NSPerson alloc] init];
  NSLog(@"%p %p",
              object_getClass(person),
              object_getClass(object_getClass(person))
);

//log
2020-08-29 18:13:25.156169+0800 runtime_API[13610:390470] 0x1000020f0 0x1000020c8

2. Class object_setClass(id obj, Class cls)

設(shè)置isa指向的class

  NSPerson *person = [[NSPerson alloc] init];
  object_setClass(person, NSCar.class);
  NSLog(@"%@",        object_setClass(person, NSCar.class));
  [person run];

// log
2020-08-29 18:21:24.521334+0800 runtime_API[13712:397596] NSCar
2020-08-29 18:21:24.521394+0800 runtime_API[13712:397596] -[NSCar run]

3. BOOL object_isClass(id obj)

判斷一個(gè)oc對(duì)象是否class

        NSLog(@"%d %d %d",object_isClass(person),
              object_isClass(object_getClass(person)),
              object_isClass(object_getClass(object_getClass(person)))
              );

//log
2020-08-29 19:17:35.832826+0800 runtime_API[14234:426760] 0 1 1

4.1. Ivar class_getInstanceVariable(Class cls, const char * name)

獲取示例變量信息

4.2. id object_getIvar(id obj, Ivar ivar)

獲取成員變量的值

4.3. void object_setIvar(id obj, Ivar ivar, id value)

設(shè)置成員變量的值

4.4. void object_setIvarWithStrongDefault(id obj, Ivar ivar, id value)

設(shè)置成員變量的值(默認(rèn)strong)

    //獲取示例變量信息
    Ivar age_ivar = class_getInstanceVariable(NSPerson.class, "_age");
    const char *age_name = ivar_getName(age_ivar);
    const char *age_type = ivar_getTypeEncoding(age_ivar);
    NSLog(@"%s %s", age_name,age_type);
    
    //設(shè)置和獲取成員變量的值

    //age
    object_setIvar(person, age_ivar, (__bridge id)(void *)27);
    id age = object_getIvar(person, age_ivar);
    NSLog(@"%d %d %@",person.age, (int)age,[person valueForKey:@"_age"]);
    
    //name
    Ivar name_ivar = class_getInstanceVariable(NSPerson.class, "_name");
    object_setIvar(person, name_ivar, @"bien");
    id name = object_getIvar(person, name_ivar);
    NSLog(@"%@ %@ %@",name,person.name,[person valueForKey:@"_name"]);

    //設(shè)置成員變量的值(默認(rèn)strong)
    object_setIvarWithStrongDefault(person, name_ivar, @"wbn");
    NSLog(@"%@",person.name);

    
    //log
2020-08-29 20:23:18.234092+0800 runtime_API[15160:476832] _age i
2020-08-29 20:23:18.234382+0800 runtime_API[15160:476832] 27 27 27
2020-08-29 20:23:18.234551+0800 runtime_API[15160:476832] bien bien bien
2020-08-29 20:40:01.942927+0800 runtime_API[15301:488642] wbn

ARC不可用

id  object_copy(id obj, size_t size)   OBJC_ARC_UNAVAILABLE;
id  object_dispose(id obj)  OBJC_ARC_UNAVAILABLE;
Ivar object_setInstanceVariable(id obj, const char * name, void * value)
Ivar object_setInstanceVariableWithStrongDefault(id obj,const char * name,void * value)
Ivar object_getInstanceVariable(id obj, const char * name, void * * outValue)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 當(dāng)目前為止我們已經(jīng)了解了runtime 是如何查找方法,以及如何緩存方法; 如何關(guān)聯(lián)對(duì)象,給分類添加成員變量;Cl...
    小心韓國(guó)人閱讀 668評(píng)論 0 0
  • API - 類 動(dòng)態(tài)創(chuàng)建一個(gè)類(參數(shù):父類,類名,額外的內(nèi)存空間)Class objc_allocateClass...
    飄搖的水草閱讀 216評(píng)論 0 0
  • 序言 本篇文章主要介紹runtime有關(guān)API及使用 一 類 1.1 動(dòng)態(tài)創(chuàng)建一個(gè)類(參數(shù):父類,類名,額外的內(nèi)存...
    zysmoon閱讀 381評(píng)論 0 0
  • 面試題:什么是Runtime,平時(shí)項(xiàng)目中有用到嗎? OC是一門動(dòng)態(tài)性比較強(qiáng)的編程語(yǔ)言,允許很多操作推遲到程序運(yùn)行時(shí)...
    張無奈閱讀 1,045評(píng)論 0 0
  • 一、 1.動(dòng)態(tài)創(chuàng)建一個(gè)類(參數(shù):父類、類名、額外的內(nèi)存空間)objc_allocateClassPair(Clas...
    xlii閱讀 391評(píng)論 0 1

友情鏈接更多精彩內(nèi)容