好多天沒有寫部落格,就把這些天總結的一些東西拿出來分享下
下面簡單的談一談runtime,小弟才疏學淺,有錯誤的地方希望指出來。。。
不多說了直接上**吧,好多筆記都寫成了注釋。。
/**
* runtime 簡稱為執行時。oc就是一種執行時機制,就是再執行的時候執行的一種機制,其中最主要的是訊息機制
* 相對來說c語言是在編譯的時候就知道要呼叫哪個函式,因為c語言如果只宣告函式不去實現,在編譯的時候就會報錯
* 但是對於oc的函式來說,編譯時候,你可以只宣告但是不去實現,但是在執行的時候就會報錯。因為在執行的時候會呼叫這個函式。
* * runtime的幾個作用:
* 1、訊息機制:oc中呼叫方法的本質實質就是讓物件傳送訊息objc_msgsend
* 2、交換方法(開發中常用的方法):讓兩個方法交換,即在呼叫兩個方法的時候互相執行對方的方法
* 3、動態的新增方法
* 4、給分類新增屬性
* 5、字典轉模型、封裝資料庫、自動解檔和歸檔
*//** 訊息機制*/
// 類方法本質:類物件呼叫[nsobject class]
// id:誰傳送訊息
// sel:傳送什麼訊息
// ((nsobject *(*)(id, sel))(void *)objc_msgsend)([nsobject class], @selector(alloc));
開發中使用場景:需要用到runtime,訊息機制
1.裝逼
2.不得不用runtime訊息機制,可以幫我呼叫私有方法.
// person *p = [person alloc];
person *p = objc_msgsend(objc_getclass("person"), sel_registername("alloc"));
// p = [p init];
p = objc_msgsend(p, sel_registername("init"));
// 呼叫eat
[p eat];
objc_msgsend(p, @selector(eat));
// objc_msgsend(p, @selector(run:),20);
/** 使用訊息機制的一些問題*/
// xcode6之前,蘋果執行使用objc_msgsend.而且有引數提示
// xcode6蘋果不推薦我們使用runtime
// 解決訊息機制方法提示步驟
// 查詢build setting -> 搜尋msg
// 最終生成訊息機制,編譯器做的事情
// 最終**,需要把當前**重新編譯,用xcode編譯器,clang
// clang -rewrite-objc main.m 檢視最終生成**
/* runtime(交換方法):只要想修改系統的方法實現
需求:比如說有乙個專案,已經開發了2年,忽然專案負責人新增乙個功能,每次uiimage載入,告訴我是否載入成功
// 給系統的imagenamed新增功能,只能使用runtime(互動方法)
// 1.給系統的方法新增分類
// 2.自己實現乙個帶有擴充套件功能的方法
// 3.互動方法,只需要互動一次,
// 1.自定義uiimage
// 2.uiimage新增分類
弊端:1.每次使用,都需要匯入
2.專案大了,沒辦法實現
*/// 把類載入進記憶體的時候呼叫,只會呼叫一次
+ (void)load
// 1.載入
// 2.判斷是否載入成功
+ (uiimage *)xmg_imagenamed:(nsstring *)name
else
return image;}/*
開發中不太常用,但是面試的時候用
runtime(動態新增方法):oc都是懶載入機制,只要乙個方法實現了,就會馬上新增到方法列表中.
qq,微博,直播等等應用,都有會員機制
美團有個面試題?有沒有使用過performselector,什麼時候使用?動態新增方法的時候使用過?怎麼動態新增方法?用runtime?為什麼要動態新增方法?
*/ 什麼時候動態新增方法: 如果有些方法不經常用,可以先不去實現,使用動態新增方法的方法去呼叫
person *p = [[person alloc] init];
[p performselector:@selector(run:) withobject:@10];
//這時候要呼叫run的方法,那麼久要在.m檔案中實現一下方法
// 沒有返回值,也沒有引數
// void,(id,sel)
void aaa(id self, sel _cmd, nsnumber *meter)
// 任何方法預設都有兩個隱式引數,self,_cmd
// 什麼時候呼叫:只要乙個物件呼叫了乙個未實現的方法就會呼叫這個方法,進行處理
// 作用:動態新增方法,處理未實現
+ (bool)resolveinstancemethod:(sel)sel
return [super resolveinstancemethod:sel];
}// 動態新增屬性:什麼時候需要動態新增屬性
// 開發場景
// 給系統的類新增屬性的時候,可以使用runtime動態新增屬性方法
// 本質:動態新增屬性,就是讓某個屬性與物件產生關聯
// 需求:讓乙個nsobject類 儲存乙個字串
// runtime一般都是針對系統的類
// 通過這兩個方法進行賦值
- (void)setname:(nsstring *)name
- (nsstring *)name
對iOS鎖的一些研究
objc view plain copy import import import import define iterations 1024 1024 32 void testlock now cfabsolutetimegetcurrent printf nslock f sec n now t...
對synchronized this 的一些理解
一 當兩個併發執行緒訪問同乙個物件object中的這個synchronized this 同步 塊時,乙個時間內只能有乙個執行緒得到執行。另乙個執行緒必須等待當前執行緒執行完這個 塊以後才能執行該 塊。二 然而,當乙個執行緒訪問object的乙個synchronized this 同步 塊時,另乙個...
對synchronized this 的一些理解
一 當兩個併發執行緒訪問同乙個物件object中的這個synchronized this 同步 塊時,乙個時間內只能有乙個執行緒得到執行。另乙個執行緒必須等待當前執行緒執行完這個 塊以後才能執行該 塊。二 然而,當乙個執行緒訪問object的乙個synchronized this 同步 塊時,另乙個...