RunTime常用場景小結

2021-08-27 05:26:59 字數 2077 閱讀 9961

1.訊息**機制:當呼叫某物件上某個方法(sendmessage),而該方法沒有實現時,系統會報unrecognized selector的異常。在此異常之前走了一圈流程(如圖),objc的執行時會給出三次拯救程式崩潰的機會。

第一次:

當這個類被呼叫乙個沒有實現的類方法 ,會呼叫+ (bool)resolveclassmethod:(sel)sel或者+ (bool)resolveinstancemethod:(sel)sel,可以在提供乙個函式實現;

//當這個類被呼叫了乙個沒有實現的物件方法

+ (bool)resolveinstancemethod:(sel)sel

return [super resolveinstancemethod:sel];

}void sendmessage(id self, sel _cmd ,nsstring *message)

第二次:

當第一次機會沒有把握後會呼叫fast forwarding 訊息**,此時的訊息**給其他的物件,只要這個方法返回的不是nil和self,整個訊息傳送的過程就會被重啟,當然傳送的物件會變成返回的那個物件(son)。

// fast forwarding 訊息** 第二步

- (id)forwardingtargetforselector:(sel)aselector

return [super forwardingtargetforselector:aselector];

}

第三次:

首先它會傳送-methodsignatureforselector:訊息獲得函式的引數和返回值型別。如果-methodsignatureforselector:返回nil,runtime則會發出-doesnotrecognizeselector:訊息,程式這時發出異常崩潰。如果返回了乙個函式簽名,runtime就會建立乙個nsinvocation物件並傳送-forwardinvocation:訊息給目標物件。

//normal forwarding 訊息** 第三步

//越到後面消耗越大

//1- (nsmethodsignature *)methodsignatureforselector:(sel)aselector

return [super methodsignatureforselector:aselector];

}//2

- (void)forwardinvocation:(nsinvocation *)aninvocation

[super forwardinvocation:aninvocation];

}//訊息無法處理

- (void)doesnotrecognizeselector:(sel)aselector

2.通過分類擴充套件屬性:分類中是無法設定屬性,property只能為其生成get 和 set 方法的宣告,但無法生成成員變數。所以需要借助runtime為分類擴充套件屬性功能。

//通過分類擴充套件屬性

- (void)setisselected:(bool)isselected

- (bool)isseted

+ (void)load

//類似於方法這樣的高階功能

//協商注釋!

+(instancetype)wp_urlwithstring:(nsstring *)urlstring

return url;}

4.序列化和反序列:(歸根到底還是遍歷屬性)

//序列化和反序列化

- (void)encodewithcoder:(nscoder *)acoder;

//立即釋放properties指向的記憶體

free(properties);

//(2)根據型別給屬性賦值

for (nsstring * key in keys)

}return self;

}

Runtime工作實用場景

先說乙個我工作中用到的場景吧 產品經理說5s上字型太小了,專案比較大,設定字型的 太多了,不可能乙個個改 這個時候runtime就派上用場了,我這裡交換的系統方法是willmovetosuperview 也可以交換systemfontofsize 也就是hook了系統的方法 零 交換方法 這裡就實現...

iOS開發 runtime使用場景

1.訊息 import import objc msgsend id person class selector walk 2.獲取所有方法,變數 objc property t propertys class copypropertylist clazz,outcount 3.交換方法 aop 外...

Data URI 應用場景小結

data uri scheme 在前端開發中是個常用的技術,通常會在 css 設定背景圖中用到。比如在 google 的首頁就有用到 data uri scheme 簡稱 data uri,經常會被錯誤地寫成 data urls。筆者認為通常用於將 base64 編碼的 data uri 可以稱為 ...