runtime簡單使用

2021-07-27 05:23:19 字數 2934 閱讀 6088

1.傳送訊息

// 建立person物件

person *p = [[person alloc] init];

// 呼叫物件方法

[p eat];

// 本質:讓物件傳送訊息

objc_msgsend(p, @selector(eat));

// 呼叫類方法的方式:兩種

// 第一種通過類名呼叫

[person eat];

// 第二種通過類物件呼叫

[[person class] eat];

// 用類名呼叫類方法,底層會自動把類名轉換成類物件呼叫

// 本質:讓類物件傳送訊息

objc_msgsend([person class], @selector(eat));

2.交換方法

@implementation viewcontroller

- (void)viewdidload

@end

@implementation uiimage (image)

// 載入分類到記憶體的時候呼叫

+ (void)load

// 不能在分類中重寫系統方法imagenamed,因為會把系統的功能給覆蓋掉,而且分類中不能呼叫super.

// 既能載入又能列印

+ (instancetype)imagewithname:(nsstring *)name

return image;

}@end

3.動態新增方法

@implementation viewcontroller

- (void)viewdidload

@end

@implementation person

// void(*)()

// 預設方法都有兩個隱式引數,

void eat(id self,sel sel)

// 當乙個物件呼叫未實現的方法,會呼叫這個方法處理,並且會把對應的方法列表傳過來.

// 剛好可以用來判斷,未實現的方法是不是我們想要動態新增的方法

+ (bool)resolveinstancemethod:(sel)sel

return [super resolveinstancemethod:sel];

}@end

4.給分類新增屬性
@implementation viewcontroller

- (void)viewdidload

@end

// 定義關聯的key

static const char *key = "name";

@implementation nsobject (property)

- (nsstring *)name

- (void)setname:(nsstring *)name

@end

5.字典轉模型

@implementation nsobject (log)

// 自動列印屬性字串

+ (void)resolvedict:(nsdictionary *)dictelse if ([obj iskindofclass:nsclassfromstring(@"__nscfarray")])else if ([obj iskindofclass:nsclassfromstring(@"__nscfnumber")])else if ([obj iskindofclass:nsclassfromstring(@"__nscfdictionary")])

// 屬性字串

nsstring *str;

if ([type containsstring:@"ns"]) else

// 每生成屬性字串,就自動換行。

}];// 把拼接好的字串列印出來,就好了。

nslog(@"%@",strm);

}@end

@implementation status

+ (instancetype)statuswithdict:(nsdictionary *)dict

@end

- (void)setvalue:(id)value forundefinedkey:(nsstring *)key

@implementation viewcontroller

- (void)viewdidload

// 測試資料

nslog(@"%@ %@",_statuses,[_statuses[0] user]);

}@end

@implementation nsobject (model)

+ (instancetype)modelwithdict:(nsdictionary *)dict

; // 用乙個ivar *指標指向陣列第乙個元素

ivar *ivarlist = a;

// 根據指標訪問陣列第乙個元素

ivarlist[0];

*/unsigned int count;

// 獲取類中的所有成員屬性

ivar *ivarlist = class_copyivarlist(self, &count);

for (int i = 0; i < count; i++)

}// **轉換:nsarray中也是字典,把陣列中的字典轉換成模型.

// 判斷值是否是陣列

if ([value iskindofclass:[nsarray class]])

// 把模型陣列賦值給value

value = arrm;}}

if (value)

}return objc;

}@end

runtime簡單理解

runtime 執行時機制 首先必須明白的 1.是什麼 1 runtime是一套比較底層的純c語言api,屬於1個c語言庫,包含了很多底層的c語言api 2 平時編寫的oc 在程式執行過程中,其實最終都是轉成了runtime的c語言 runtime算是oc的幕後工作者 下面這就是乙個例項,在前面的文...

RunTime的執行機制簡單使用

runtime 是一套比較底層的純c語言api 它是oc的幕後工作者 我們平時寫的oc 在執行時都會編譯器轉為runtime的c語言 其中最主要的是訊息機制oc的函式呼叫,成為訊息傳送 屬於動態呼叫過程 在編譯的時候並不能決定真正呼叫哪個函式事實證明,在編譯階段,oc可以呼叫任何函式,即使這個函式並...

runtime基本使用

用法詳見zjrtextfiled 什麼是runtime?1 runtime是一套底層的c語言api 包括很多實用的c語言型別,c語言函式 2 實際上,平時我們編譯的oc 底層都是基於runtime實現的 也就是說,我們平時編寫的oc 最終都是轉成了底層的runtime c語言 執行時 runtime...