1.runtime 叫做執行時機制,其實oc也有執行時機制-訊息機制!我們oc中呼叫方法的時候,其實底層就是發訊息。
2.c語言中,函式的呼叫在編譯的時候會決定呼叫哪個函式。
3.oc當中的函式,屬於動態呼叫的過程,在編譯的時候並不能決定真正呼叫哪個函式,只有在執行的時候才會決定呼叫函式。
那麼,現在就可以得出:
(1)在編譯階段,oc可以呼叫任何函式,即使這個函式病沒有實現,只要宣告了就不會報錯。
(2)在編譯階段,c語言呼叫未實現的函式就一定會報錯!
那麼,現在應該清楚執行時機制的特性了吧。
**1.傳送訊息
(1)上面也說了,其實方法呼叫的本質,就是讓物件發訊息(訊息機制)。
(2)objc_msgsend,只有物件才能發訊息,故以objc開頭。
(3)使用訊息機制,必須匯入#import
#import "viewcontroller.h"
@inte***ce
viewcontroller ()
@end
@implementation
viewcontroller
- (void)viewdidload
#import "uiimage+changeimage.h"
#import
@implementation
uiimage (changeimage)
//這個load 載入分類的時候第乙個呼叫
+(void)load
//不能在分類裡面重寫 imagenamed ,因為會把系統的功能給覆蓋掉,而且分類中不能呼叫super。
+ (instancetype)imagewithname:(nsstring *)nameelse
return image;
}
3.動態新增方法
(1)應用場景:如果乙個類的方法非常多,載入類到記憶體的時候比較耗費資源,需要給每個方法生成對映表,可以使用動態給某個類,新增方法。
(2)簡單的使用:
4.給分類新增屬性
(1)原理:給乙個類宣告屬性,其實本質就是給類新增關聯,並不是直接把這個值的記憶體空間新增到記憶體空間。
下面的是我類別裡面的**:
#import
"uiview+personification.h"
#import
//定義關聯的屬性名字 key
static
const
char *key = "***";
@implementation uiview (personification)
-(nsstring *)***
- (void)set***:(nsstring * )***
@end
5.字典轉模型
(1)我們寫模型屬性,需要和字典裡的key一一對應
(2)那麼問題來了:乙個個的生成模型屬性,很慢?
(3)解決方案:能否自動的根據乙個字典,生成對應的屬性呢?
(4)實施方案:提供乙個分類,專門根據字典生成對應的屬性字串。
#import "nsobject+ly_category.h"
@implementation nsobject (ly_category)
//自動列印屬性字串
+ (void)reslovedictionary:(nsdictionary * )dicelse
if ([obj iskindofclass:nsclassfromstring(@"__nscfarray")])else
if ([obj iskindofclass:nsclassfromstring(@"__nscfnumber")])else
if ([obj iskindofclass:nsclassfromstring(@"__nsdictionary")])
//屬性字串
nsstring * str;
if ([type
containsstring:@"ns"]) else
//每生成屬性字串,自動換行
}];//列印拼接好的字串
nslog(@"%@",strsum);
}@end
(5)字典轉模型的方式之一:kvc
#import "ly_dictomode.h"
@implementation
ly_dictomode
+ (instancetype)ly_dictomodefromekvc:(nsdictionary *)dic
@end
注意:這種方式必須保證,模型中的屬性和字典中的key一一對應!
如果不對應的話,只能重寫物件的setvalue:forundefinedkey:,把系統的方法覆蓋,
就能繼續使用kvc,字典轉模型了。
(6)隆重推出第二個字典轉模型的方式-runtime
思路:利用執行時,遍歷模型中所有屬性,根據模型的屬性名,去字典中查詢key,取出對應的值,給模型的屬性賦值。
步驟:提供乙個nsobject分類,專門字典轉模型,以後所有模型都可以通過這個分類轉。
+ (instancetype)modelwithdic:(nsdictionary *)dic;
// 用乙個ivar *指標指向陣列第乙個元素
ivar *ivarlist = a;
// 根據指標訪問陣列第乙個元素
ivarlist[0];
*///獲取類中所有的成員屬性
ivar * ivarlist = class_copyivarlist(self, &count);
//遍歷屬性陣列
for (int i = 0; i//去除成員屬性
ivar ivar = ivarlist[i];
//獲取成員屬性名
nsstring * name = [nsstring stringwithutf8string:ivar_getname(ivar)];
// 處理成員屬性名->字典中的key
// 從第乙個角標開始擷取
nsstring * key = [name substringfromindex:1];
// 根據成員屬性名去字典中查詢對應的value
id value = dic[key];
// 二級轉換:如果字典中還有字典,也需要把對應的字典轉換成模型
// 判斷下value是否是字典
if ([value iskindofclass:[nsdictionary class]])
}// **轉換:nsarray中也是字典,把陣列中的字典轉換成模型.
// 判斷值是否是陣列
if ([value iskindofclass:[nsarray class]])
// 把模型陣列賦值給value
value = arrm;}}
if (value)
}return objc;
}@end
IOSruntime 執行時機制
首先必須明白的 1.是什麼 1 runtime是一套比較底層的純c語言api,屬於1個c語言庫,包含了很多底層的c語言api 2 平時編寫的oc 在程式執行過程中,其實最終都是轉成了runtime的c語言 runtime算是oc的幕後工作者 下面這就是乙個例項,在前面的文章中講到過了 通過編譯成c語...
iOS Runtime執行時機制的正確使用姿勢
runtime執行時機制在專案中的實際使用 相信很多人都有過這樣的經歷,就是當我們接手乙個專案時,若要修復某個bug或是檢視某某功能是如何實現的,特別是大專案,再加上對專案的業務邏輯不熟悉 對專案的設計架構不熟悉的情況下,我們往往感到無從下手,或是需要花一定的時間才能找出對應的類。這篇部落格就是為了...
runtime 執行時機制
首先,第乙個問題,1 runtime實現的機制是什麼,怎麼用,一般用於幹嘛?這個問題我就不跟大家繞彎子了,直接告訴大家,runtime是一套比較底層的純c語言api,屬於1個c語言庫,包含了很多底層的c語言api。在我們平時編寫的oc 中,程式執行過程時,其實最終都是轉成了runtime的c語言 r...