iOS開發 RunTime總結篇

2022-06-05 13:48:09 字數 2616 閱讀 6485

在學習runtime的基礎時, 我們要搞清楚一些重要的東西, 一些專業術語:

我們可以從這些東西裡獲取到指定類的所有資訊, 無論是公開的, 還是私有的, 全部都可以拿到, 並且操作.

作為乙個開發者,有乙個學習的氛圍跟乙個交流圈子特別重要,這是乙個我的ios***:413038000,不管你是大牛還是小白都歡迎入駐 ,分享bat,阿里面試題、面試經驗,討論技術, 大家一起交流學習成長!

ps: 但操作私有方法的時候, 注意不要用來上架, 除非你有方法讓蘋果審核的時候通過.高階路徑圖:

在學習runtime高階的時候, 我們就要了解更加的深入.

訊息機制:

物件關聯:

物件關聯的策略:

動態方法解析:

應用路徑圖:

在學習完runtime之後, 我們就可以應用到我們的實際開發中.

category

class

model

在實際開發中, 我們有一些例項場景會用到runtime:

runtime method swizzling開發例項彙總

問題:objc在向乙個物件傳送訊息時, 發生了什麼?

1.根據物件的isa指標找到類物件id, 在查詢類物件裡面的methodlists方法函式列表

2.如果沒有在好到, 在沿著superclass, 尋找父類,再在父類methodlists方法列表裡面查詢

3.最終找到sel, 根據idsel確認imp(指標函式), 在傳送訊息.

問題:什麼時候會報unrecognized selector錯誤?ios有哪些機制來避免走到這一步?

1.當傳送訊息的時候, 我們會根據類裡面的methodlists列表去查詢我們要動用的sel, 當查詢不到的時候, 我們會一直沿著父類查詢

2.當最終查詢不到的時候我們會報unrecognized selector錯誤, 當系統查詢不到方法的時候, 會呼叫+(bool)resolveinstancemethod:(sel)sel動態解釋的方法來給我一次機會來新增, 呼叫不到的方法.

3.或者我們可以再次使用-(id)forwardingtargetforselector:(sel)aselector重定向的方法來告訴系統,該呼叫什麼方法,一來保證不會崩潰.

問題:能否向編譯後得到的類中增加例項變數?能否向執行時建立的類中新增例項變數? 為什麼?

1.不能向編譯後得到的類增加例項變數.

2.能向執行時建立的類中新增例項變數.

解釋:

1. 編譯後的類已經註冊在runtime中,類結構體中的objc_ivar_list例項變數的鍊錶和instance_size例項變數的記憶體大小已經確定,runtime會呼叫class_setvarlayoutclass_setweaklvarlayout來處理strong``weak引用.所以不能向存在的類中新增例項變數.

2. 執行時建立的類是可以新增例項變數,呼叫class_addivar函式. 但是的在呼叫objc_allocateclasspair之後,objc_registerclasspair之前,原因同上.

問題:runtime如何實現weak變數的自動置nil?

1.runtime對註冊的類, 會進行布局,對於weak物件會放入乙個hash表中。 用weak指向的物件記憶體位址作為key,當此物件的引用計數為0的時候會dealloc.

2.假如weak指向的物件記憶體位址是a,那麼就會以a為鍵, 在這個weak表中搜尋,找到所有以a為鍵的weak物件,從而設定為nil.

問題:給類新增乙個屬性後,在類結構體裡哪些元素會發生變化

1.instance_size:例項的記憶體大小.

2.objc_ivar_list *ivars: 屬性列表.

iOS開發 runtime機制

runtime簡稱執行時。就是系統在執行的時候的一些機制,其中最主要的是訊息機制。對於c語言,函式的呼叫在編譯的時候會決定呼叫哪個函式 c語言的函式呼叫請看這裡 編譯完成之後直接順序執行,無任何二義性。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...

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...