一、runtime簡介
runtime簡稱執行時。oc就是執行時機制,也就是在執行時候的一些機制,其中最主要的是訊息機制。
對於c語言,函式的呼叫在編譯的時候會決定呼叫哪個函式。
對於oc的函式,屬於動態呼叫過程,在編譯的時候並不能決定真正呼叫哪個函式,只有在真正執行的時候才會根據函式的名稱找到對應的函式來呼叫。
事實證明:
在編譯階段,oc可以呼叫任何函式,即使這個函式並未實現,只要宣告過就不會報錯。
在編譯階段,c語言呼叫未實現的函式就會報錯。
二、runtime作用
1.傳送訊息
方法呼叫的本質,就是讓物件傳送訊息。
objc_msgsend,只有物件才能傳送訊息,因此以objc開頭.
使用訊息機制前提,必須匯入 objc/message.h標頭檔案
訊息機制簡單使用
//建立person物件
person *p = [[person alloc] init];
//呼叫物件方法
[p eat];
//本質:讓物件傳送訊息
objc_msgsend(p, @selector(eat));
//呼叫類方法的方式:兩種
//第一種通過類名呼叫
[person eat];
//第二種通過類物件呼叫
[[person class] eat];
/*用類名呼叫類方法,底層會自動把類名轉換成類物件呼叫
本質:讓類物件傳送訊息 */
objc_msgsend([person class], @selector(eat));
//訊息機制原理:物件根據方法編號sel去對映表查詢對應的方法實現
2.交換方法
開發使用場景:系統自帶的方法功能不夠,給系統自帶的方法擴充套件一些功能,並且保持原有的功能。
方式一:繼承系統的類,重寫方法.
方式二:使用runtime,交換方法.
#import "viewcontroller.h"
#import "uiimage+image.h"
#import
@implementation
viewcontroller
- (void)viewdidload
@end
#import "uiimage+image.h"
#import
@implementation
uiimage (image)
/*定義完畢新方法後,需要弄清楚什麼時候實現與系統的方法互動?
既然是給系統的方法新增額外的功能,換句話說,我們以後在開發中都是使用自己定義的方法,取代系統的方法,所以,當程式一啟動,就要求能使用自己定義的功能方法.說道這裡:我們必須要弄明白一下兩個方法 :
+(void)initialize(當類第一次被呼叫的時候就會呼叫該方法,整個程式執行中只會呼叫一次)
+ (void)load(當程式啟動的時候就會呼叫該方法,換句話說,只要程式一啟動就會呼叫load方法,整個程式執行中只會呼叫一次)*/
//載入分類到記憶體的時候呼叫
+ (void)load
列印結果:2016-09-13
17:46:59.703 runtime[5243:2515939] 載入的名為:123
3.動態新增方法
#import "viewcontroller.h"
#import "person.h"
#import
@inte***ce
viewcontroller ()
@end
@implementation
viewcontroller
/*開發使用場景:如果乙個類方法非常多,載入類到記憶體的時候也比較耗費資源,需要給每個方法生成對映表,可以使用動態給某個類,新增方法解決。*/
/*經典面試題:有沒有使用performselector,其實主要想問你有沒有動態新增過方法。
簡單使用*/
- (void)viewdidload
@end
#import "person.h"
#import
@implementation
person
預設方法都有兩個隱式引數
/*1, self:方法呼叫者
_cmd:當前呼叫方法編號
方法的隱式引數即: 沒有暴露出來引數.*/
void study(id
self, sel _cmd)
//當乙個物件呼叫未實現的方法,會呼叫這個方法處理,並且會把對應的方法列表傳過來.
//剛好可以用來判斷,未實現的方法是不是我們想要動態新增的方法
+ (bool)resolveinstancemethod:(sel)sel
// 先恢復, 不然會覆蓋系統的方法
return [super resolveinstancemethod:sel];
}// 引數解釋:
// class;給哪個類新增方法
// sel:新增方法
// imp:方法實現,函式名
// types:方法型別(不要去死記,官方文件中有)
//class_addmethod(__unsafe_unretained class cls, sel name, imp imp, const char *types)
@end
4.給分類新增屬
原理:給乙個類宣告屬性,其實本質就是給這個類新增關聯,並不是直接把這個值的記憶體空間新增到類存空間
#import "viewcontroller.h"
#import "nsobject+property.h"
#import
@inte***ce
viewcontroller ()
@end
@implementation
viewcontroller
- (void)viewdidload
@end
#import "nsobject+property.h"
#import
//定義關聯的key
static
const
char *key = "name";
@implementation
nsobject (property)
- (nsstring *)name
- (void)setname:(nsstring *)name
@end
iOS runtime,訊息傳送
objective c runtime ios執行時 runtime 詳解 demo ios 訊息傳送與 詳解 ios runtime 的使用場景 實戰篇 method swizzling oc 實現 ios runtime實戰應用 method swizzling method swizzling...
iOS Runtime基礎結構
runtime概念 oc是基於c的,區別於c的一點就是oc屬於動態語言,並且有物件導向的特性。相比於c,函式的呼叫在編譯的時候會決定呼叫哪個函式。oc會在編譯和鏈結時做的事情放到了執行時 runtime 來處理,其呼叫函式的方法為msg send,屬於動態呼叫,只有在真正執行才會根據函式名稱找到對應...
iOS Runtime字型適配
你還在為適配字型大小發愁?看這裡 define myuiscreen 375 ui設計原型圖的手機尺寸寬度 6 6p的 414 implementation uifont runtime void load uifont adapterfontofsize cgfloat fontsize 正常呼叫...