(1)runtime簡稱執行時。oc就是「執行時機制」,也就是在執行時候的一些機制,其中最主要的是訊息機制
對於c語言,「函式的呼叫在編譯的時候會決定呼叫哪個函式」
對於oc的函式,屬於「動態呼叫過程」,在編譯的時候並不能決定真正呼叫哪個函式,只有在真正執行的時候才會根據函式的名稱找到對應的函式來呼叫
在編譯階段,oc可以「呼叫任何函式」,即使這個函式並未實現,只要宣告過就不會報錯
在編譯階段,c語言呼叫「未實現的函式」就會報錯
(2)作用:1 傳送訊息
方法呼叫的本質,就是讓物件傳送訊息
objc_msgsend,只有物件才能傳送訊息,因此以objc開頭
使用`訊息機制`前提,必須匯入#import
clang -rewrite-objc main.m 檢視最終生成**
什麼時候需要用到
runtime
(訊息機制):不得不用
runtime
訊息機制,可以幫我呼叫私有方法
//建立person物件
person *p = [[person alloc] init];
//呼叫物件方法
[p eat];
//本質:讓物件傳送訊息
objc_msgsend(p, @selector(eat));
//呼叫類方法的方式:兩種
//第一種通過類名呼叫
[person eat];
//第二種通過類物件呼叫
[[person class] eat];
//用類名呼叫類方法,底層會自動把類名轉換成類物件呼叫
//本質:讓類物件傳送訊息
objc_msgsend([person class], @selector(eat));
//方法呼叫流程:
//物件方法儲存在類物件的方法列表,類方法儲存在元類中方法列表
//1 通過isa去對應的類中查詢
//2 註冊方法編號
//3 根據方法編號去查詢對應方法
//4 找到只是最終函式實現位址,根據位址去方法區呼叫對應函式
//person *p = [person alloc];
person *p = objc_msgsend(objc_getclass("person"), sel_registername("alloc"));
//p = [p init];
p = objc_msgsend(p, sel_registername("init"));
//呼叫有引數的方法
objc_msgsend(p, @selector(run:),20);
2 交換方法
開發使用場景:系統自帶的方法功能不夠,給系統自帶的方法擴充套件一些功能,並且保持原有的功能。
方式一:繼承系統的類,重寫方法
方式二:使用runtime,交換方法
@implementation viewcontroller
- (void)viewdidload
@end
//uiimage分類
@implementation uiimage (image)
//載入分類到記憶體的時候呼叫
+ (void)load
//不能在分類中重寫系統方法imagenamed,因為會把系統的功能給覆蓋掉,而且分類中不能呼叫super.
//既能載入又能列印
+ (instancetype)imagewithname:(nsstring *)name
return image;
}@end
3 動態新增方法
開發使用場景:如果乙個類方法非常多,載入類到記憶體的時候也比較耗費資源,需要給每個方法生成對映表,可以使用動態給某個類,新增方法解決
經典面試題:有沒有使用performselector,什麼時候使用?(動態新增方法的時候)
runtime(動態新增方法):oc都是懶載入機制,只要乙個方法實現了,就會馬上新增到方法列表中
@implementation viewcontroller
- (void)viewdidload
@end
@implementation person
//任何方法預設都有兩個隱式引數,self,_cmd
//_cmd:當前方法的方法編號
void aaa(id self, sel _cmd, nsnumber *meter)
//什麼時候呼叫:只要乙個物件呼叫了乙個未實現的方法就會呼叫這個方法,進行處理
//作用:動態新增方法,處理未實現
+ (bool)resolveinstancemethod:(sel)sel
return [super resolveinstancemethod:sel];
}@end
4 給分類新增屬性
原理:給乙個類宣告屬性,其實本質就是給這個類新增關聯,並不是直接把這個值的記憶體空間新增到類存空間
@implementation viewcontroller
- (void)viewdidload
@end
//nsobject+property.h
@implementation nsobject (property)
//static nsstring *_name;
- (void)setname:(nsstring *)name
- (nsstring *)name
@end
5 字典轉模型
@implementation viewcontroller
- (void)viewdidload
//測試資料
nslog(@"%@ %@",_statuses,[_statuses[0] user]);
}@end
//nsobject+model.h
@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 執行時機制
首先,第乙個問題,1 runtime實現的機制是什麼,怎麼用,一般用於幹嘛?這個問題我就不跟大家繞彎子了,直接告訴大家,runtime是一套比較底層的純c語言api,屬於1個c語言庫,包含了很多底層的c語言api。在我們平時編寫的oc 中,程式執行過程時,其實最終都是轉成了runtime的c語言 r...
runtime 執行時機制
必備常識 1.ivar 成員變數 2.method 成員方法相關應用 1.nscoding 歸檔和解檔,利用runtime遍歷模型物件的所有屬性 2.字典 模型 利用runtime遍歷模型物件的所有屬性,根據屬性名從字典中取出對應的值,設定到模型的屬性上 3.kvo 利用runtime動態產生乙個類...
runtime 執行時機制
runtime 執行時機制 一 runtime是什麼 1 runtime是乙個全動態語言,是基於c語言的庫,裡面包含了很多底層的c語言函式。2 平時編寫的oc 在程式執行過程中,其實最終都是轉成了runtime的c語言 runtime算是oc方法的底層實現,換句話說oc的實現也就是runtime的底...