iOS runtime(二)runtime之Ivar 詳盡

runtime官方文章學(xué)習(xí)大綱

1.獲取成員變量列表

1.1相關(guān)函數(shù)

Ivar可以看出也是一個(gè)變量類(lèi)型
typedef struct objc_ivar *Ivar;
//獲取成員變量列表
Ivar *class_copyIvarList(Class cls, unsigned int * outCount) 
//獲取成員變量類(lèi)型編碼
const char *ivar_getTypeEncoding(Ivar  v) 
//獲取成員變量名稱(chēng)
const char *ivar_getName(Ivar  v) 

1.2實(shí)例代碼

#import "ViewController.h"
#import <objc/runtime.h>

@interface ViewController ()

@property (nonatomic,strong)NSString *name;
@property (nonatomic,assign)NSString *age;
@property (nonatomic,strong)NSString *address;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    [self class_copyIvarList];
}

- (void)class_copyIvarList{
    uint count;
    Ivar *ivars = class_copyIvarList([self class], &count);
    for (unsigned int i = 0; i < count; i ++) {
        Ivar ivar = ivars[i];
        //獲取成員變量名稱(chēng)
        NSString* name = @(ivar_getName(ivar));
        //獲取成員變量數(shù)據(jù)類(lèi)型
        NSString * type = @(ivar_getTypeEncoding(ivar));
        NSLog(@"類(lèi)型為 %@ 的 %@ ",type, name);
    }
    free(ivars);
}

1.3打印數(shù)據(jù)

2018-05-26 10:02:36.597199+0700 runTimer[6417:1017717] 類(lèi)型為 @"NSString" 的 _name 
2018-05-26 10:02:36.597586+0700 runTimer[6417:1017717] 類(lèi)型為 @"NSString" 的 _age 
2018-05-26 10:02:36.597852+0700 runTimer[6417:1017717] 類(lèi)型為 @"NSString" 的 _address 

1.4查漏補(bǔ)缺

 //通過(guò)變量名稱(chēng)獲取類(lèi)中的實(shí)例成員變量
 Ivar class_getInstanceVariable(Class cls, const char * name)

實(shí)例代碼及打印數(shù)據(jù):

#import "ViewController.h"
#import <objc/runtime.h>

@interface ViewController ()

@property (nonatomic,strong)NSString *name;
@property (nonatomic,assign)NSString *age;
@property (nonatomic,strong)NSString *address;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    [self class_getInstanceVariable];
}

- (void)class_getInstanceVariable{
    //注意成員變量必須“_名稱(chēng)”
    Ivar name_Ivar = class_getInstanceVariable([self class], "_name");
    NSString * name_type = @(ivar_getTypeEncoding(name_Ivar));
    NSString *name_str = @(ivar_getName(name_Ivar));
    NSLog(@"name_type:%@",name_type);
    NSLog(@"name_str:%@",name_str);
}
打印數(shù)據(jù):
2018-05-26 10:41:17.384676+0700 runTimer[7091:1043835] name_type:@"NSString"
2018-05-26 10:41:17.384831+0700 runTimer[7091:1043835] name_str:_name

2.添加成員變量

2.1相關(guān)函數(shù)

//為元類(lèi)添加成員變量
BOOL class_addIvar(Class cls, const char * name, size_t size, 
              uint8_t alignment, const char * types) 
//添加類(lèi) superclass 類(lèi)是父類(lèi)   name 類(lèi)的名字  size_t 類(lèi)占的空間
Class objc_allocateClassPair(Class superclass, const char * name,size_t extraBytes) 
//注冊(cè)類(lèi)
void objc_registerClassPair(Class  cls) 
//銷(xiāo)毀類(lèi)
void objc_disposeClassPair(Class _Nonnull cls) 

2.2實(shí)例代碼

  1. People.h
#import <Foundation/Foundation.h>

@interface People : NSObject

@end
  1. People.m
#import "People.h"

@implementation People

@end

3.實(shí)例調(diào)用:

#import "ViewController.h"
#import <objc/runtime.h>
#import "People.h"
@interface ViewController ()
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    [self class_addIvar];
}

- (void)class_addIvar{
    Class P_Class = objc_allocateClassPair([NSObject class], "_People", 0);
    BOOL isOk = NO;
    isOk = class_addIvar(P_Class,"myVar", sizeof(id), log2(sizeof(id)), "@");
    isOk == YES ? nil : NSLog(@"failed on class_addIvar");
    objc_registerClassPair(P_Class);
    id myobj = [[P_Class alloc] init];
    [myobj setValue:@"test" forKey:@"myVar"];
    NSLog(@"myVar: %@", [myobj valueForKey:@"myVar"]);
    myobj = nil;//當(dāng)_People類(lèi)或者它的子類(lèi)的實(shí)例還存在绒怨,則不能調(diào)用objc_disposeClassPair這個(gè)方法;因此這里要先銷(xiāo)毀實(shí)例對(duì)象后才能銷(xiāo)毀類(lèi)谦疾;
    objc_disposeClassPair(P_Class);
    
}
打印數(shù)據(jù):
2018-05-27 10:19:51.251273+0700 runTimer[14245:1323729] myVar: test

總結(jié):
關(guān)于這個(gè)方法南蹂,說(shuō)真的讓我產(chǎn)生了一些疑惑,至今也沒(méi)有得到答案念恍,也希望看到這篇文章對(duì)runtime有一定理解朋友可以給予一定的解釋?zhuān)?/p>

  • 疑問(wèn)一:objc_allocateClassPair 在剛開(kāi)始我創(chuàng)建獲取元類(lèi)時(shí)我得到總是nil六剥,在網(wǎng)上查了很多資料但是我沒(méi)有得到答案晚顷,后來(lái)是因?yàn)樽约菏切缘脑诶勖凹印癬” 竟然成功的獲取了,我沒(méi)有明白原因疗疟。
  • 疑問(wèn)二:關(guān)于元類(lèi)說(shuō)實(shí)話(huà)我之前也是簡(jiǎn)單的知道该默,個(gè)人理解是關(guān)于類(lèi)描述的一個(gè)類(lèi),但是我始終不能明白在元類(lèi)中添加成員變量策彤,這樣做會(huì)蘋(píng)果官方有什么樣的深意栓袖。

3 object_setIvar object_getIvar

3.1相關(guān)函數(shù)

//相當(dāng)于set方法
void object_setIvar(id obj, Ivar ivar, id value) 
//相當(dāng)于get方法
id object_getIvar(id obj, Ivar ivar) 

3.2實(shí)例代碼

1.People.h

#import <Foundation/Foundation.h>

@interface People : NSObject
@property (nonatomic,strong)NSString *phone;
@end

  1. People.m
#import "People.h"

@implementation People

@end

3.實(shí)例代碼調(diào)用:

#import "ViewController.h"
#import <objc/runtime.h>
#import <objc/message.h>
#import "People.h"
@interface ViewController ()
@property (nonatomic,strong)People *p;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    Ivar ivar = class_getInstanceVariable([People class], "_phone");
    People *p = [[People alloc] init];
    p.phone = @"1322432423";
    id name1 = object_getIvar(p, ivar);
    NSLog(@"name1:%@",name1);
    object_setIvar(p, ivar, @"1322432423");
    id name2 = object_getIvar(p, ivar);
    NSLog(@"name2:%@",name2);
}
打印數(shù)據(jù):
2018-05-27 11:05:04.551576+0700 runTimer[14991:1353337] name1:1322432423
2018-05-27 11:05:04.551717+0700 runTimer[14991:1353337] name2:1322432423

總結(jié):
看到這里的時(shí)候我想大家已經(jīng)很明白了 這兩個(gè)方法 基本上等同于set get方法。

4.未做解析方法:

ivar_getOffset
class_setWeakIvarLayout
object_setIvarWithStrongDefault
class_getWeakIvarLayout
class_getIvarLayout

好了 就那么多了 還有一些方法沒(méi)有講店诗,太懶了裹刮,就不一一解析了。
下一章庞瘸,關(guān)于runtime 關(guān)于method的解析

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末捧弃,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子擦囊,更是在濱河造成了極大的恐慌塔橡,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件霜第,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡户辞,警方通過(guò)查閱死者的電腦和手機(jī)泌类,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)底燎,“玉大人刃榨,你說(shuō)我怎么就攤上這事∷裕” “怎么了枢希?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)朱沃。 經(jīng)常有香客問(wèn)我苞轿,道長(zhǎng),這世上最難降的妖魔是什么逗物? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任搬卒,我火速辦了婚禮,結(jié)果婚禮上翎卓,老公的妹妹穿的比我還像新娘契邀。我一直安慰自己,他們只是感情好失暴,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布坯门。 她就那樣靜靜地躺著微饥,像睡著了一般。 火紅的嫁衣襯著肌膚如雪古戴。 梳的紋絲不亂的頭發(fā)上欠橘,一...
    開(kāi)封第一講書(shū)人閱讀 51,692評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音允瞧,去河邊找鬼简软。 笑死,一個(gè)胖子當(dāng)著我的面吹牛述暂,可吹牛的內(nèi)容都是我干的痹升。 我是一名探鬼主播,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼畦韭,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼疼蛾!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起艺配,我...
    開(kāi)封第一講書(shū)人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤察郁,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后转唉,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體皮钠,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年赠法,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了麦轰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡砖织,死狀恐怖款侵,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情侧纯,我是刑警寧澤新锈,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站眶熬,受9級(jí)特大地震影響妹笆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜娜氏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一晾浴、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧牍白,春花似錦脊凰、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)切省。三九已至,卻和暖如春帕胆,著一層夾襖步出監(jiān)牢的瞬間朝捆,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工懒豹, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留芙盘,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓脸秽,卻偏偏與公主長(zhǎng)得像儒老,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子记餐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時(shí)...
    歐辰_OSR閱讀 29,393評(píng)論 8 265
  • 引導(dǎo) 對(duì)于從事 iOS 開(kāi)發(fā)人員來(lái)說(shuō)驮樊,所有的人都會(huì)答出「 Runtime 是運(yùn)行時(shí) 」,什么情況下用 Runtim...
    Winny_園球閱讀 4,210評(píng)論 3 75
  • 文/不會(huì)說(shuō)謊的小丑 01 最近在朋友圈都在傳播一則新聞,很是好奇雕沿,我仔細(xì)看了看练湿。是有關(guān)于綁架事件,而且受害人都是2...
    啞白先生閱讀 522評(píng)論 0 4
  • 迷茫,曾是自己為了逃避奮斗而找的似乎理所當(dāng)然的理由榆苞,然而那只是借口稳衬。 有本書(shū)中說(shuō)“迷茫,是因?yàn)槟愕牟湃A撐不起你的理...
    醒心遠(yuǎn)志閱讀 325評(píng)論 0 1
  • 初二隨著公公婆婆坐漏、老公的兄妹們一起到鄉(xiāng)下去給老公的舅舅們拜年了薄疚! 我的老家在城里,我這邊的親戚們也都在城里赊琳,相隔都...
    精進(jìn)的醫(yī)生閱讀 642評(píng)論 69 61