iOS 關於Runtime幾個問題下面有見解

2021-08-15 20:28:05 字數 1553 閱讀 6068

* dealloc的步驟:

一般來說,當引用計數到0的時候,系統就會自動呼叫dealloc方法,在mrc中需要呼叫[super dealloc],而在arc中編譯器自動新增了這句**,所以不用呼叫,呼叫的過程一般是先走玩子類的dealloc方法,然後再呼叫父類的dealloc方法,層層釋放,和c++的析構函式一樣。

* retain release的實現,如何在arc下獲取乙個物件的引用計數,你有幾種辦法?

retain和release,說直白點這兩個方法就是對引用計數做加減操作,retain+1,release-1,系統判定retaincount是否為0,如果為0則呼叫dealloc,最終釋放記憶體。

1.在arc下retaincount不可以直接呼叫,但是並不代表不能用performselector訪問,

2、並且cggetretancount(obj)

3、_objc_rootretaincount(obj)也能獲得。

* 如果要自己實現乙個weak屬性該怎麼做

自己實現weak屬性,首先在給屬性objc_setassociatedobject的時候設定為assign,當然這並不夠,這時需要借助第二個輔助物件,建立乙個輔助物件,objc_setassociatedobject選擇retain,並且在輔助物件的析構函式中呼叫block,釋放掉該屬性,這時當物件本身dealloc時,輔助物件會也會釋放,輔助物件中的dealloc就會執行該物件屬性釋放。

* autorelease以及autoreleasepool底層的資料結構是什麼?

autoreleasepool:遵循棧的資料結構,在括號中的所有物件,在離開括號後,遵循後進先出的規則釋放。

* tagged pointer 用來幹什麼的,他是怎麼實現的。

tagged pointer:專門用於儲存小資料物件的,在64位系統中優化記憶體占用和效率問題的。當數字小於8個位元組時,數值存於指標中(特殊標記佔4位元組,數值占用4位元組),當數值大於8個位元組時,數值存於另外分配的記憶體中。

* 如何修改objective-c現在的 method swizzling

method swizzling 是否指 method_exchangeimp函式?這個函式能將兩個方法的實現進行互換。

如何修改。沒有理解到是什麼層次上的修改。如果是實現的話,應該是通過method_getimp和method_setimp函式c=a,a=b,b=c這樣來實現的。

* 所有objective-c方法在底層都有兩個預設引數,他們是什麼?

在nsinvocation中可以看到,引數要從2開始賦值,因為第乙個引數是target,第二個引數是selector

* 熱修復的原理是什麼,jspatch和以前的waxpatch有什麼異同,哪些方法使用jspatch修復不了。

熱修復原理,通過jscore讀取js方法,逐步解析,再通過runtime的method_exchangeimp函式實現改寫系統現有方法,和class_addmethod函式實現新增新方法。

至於wexpatch沒接觸過,有空會看下

另外~

iOS開發 runtime機制

runtime簡稱執行時。就是系統在執行的時候的一些機制,其中最主要的是訊息機制。對於c語言,函式的呼叫在編譯的時候會決定呼叫哪個函式 c語言的函式呼叫請看這裡 編譯完成之後直接順序執行,無任何二義性。oc的函式呼叫成為訊息傳送。屬於動態呼叫過程。在編譯的時候並不能決定真正呼叫哪個函式 事實證明,在...

iOS 知識整理 Runtime

目錄 runtime 什麼是runtime runtime 概念解析 runtime 字典轉模型 runtime 動態新增屬性 runtime 動態新增方法 runtime 交換方法 runtime 方法呼叫流程 runtime 動態訊息解析 runtime簡稱執行時,oc就是執行時機制,也就是在執...

IOS高階開發 Runtime(三)

11 系統類的方法實現部分替換 void methodexchange 列印結果 仔細看log 2013 07 26 16 33 22.776 highoc 7104 c07 sssaaaass 2013 07 26 16 33 22.778 highoc 7104 c07 sssaaaass 12...