玩轉iOS開發 裝逼技術RunTime的總結篇

2021-09-11 09:26:08 字數 2604 閱讀 5512

文章分享至我的個人技術部落格:

講到這裡,runtime的知識點和應用基本上就已經講完了, 剩下的就靠大家自己在專案中的應用以及累積了.

這一篇文章主要是

基礎路徑圖:

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

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

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: 屬性列表.

runtime快速入門

runtime應用

碼字很費腦, 看官賞點飯錢可好

玩轉iOS開發 裝逼技術RunTime的應用 三

文章分享至我的個人技術部落格 在上一章節裡曉得了怎麼在category裡關聯物件,以及利用runtime轉換模型的時候預防了三種轉換時的情況,如果沒有去看的朋友可以到玩轉ios開發 裝逼技術runtime的應用 二 看看.在以前我們在使用歸檔的時候都會有乙個煩惱,就是寫的太多,不信?我們來宣告乙個物...

玩轉iOS開發 NSURLSession講解 三

文章分享至我的個人技術部落格 雖然前面兩講都是說了nsurlsession的一些理論上的知識,但我們現在起碼對nsurlsession有個大概的了解,並不會像一開始的那樣,一臉懵逼的看著,這個請求是什麼鬼,那個方法是什麼鬼,task是什麼東西,如果沒有去看的朋友們可以去看看前面兩講玩轉ios開發 n...

玩轉iOS開發 iOS中的Socket程式設計 一

文章分享至我的個人技術部落格 socket翻譯過來中文稱為套接字,這裡我找到了一段比較官方的解釋socket是什麼東西 socket是通訊的基石,是支援tcp ip協議的網路通訊的基本操作單元,包含進行網路通訊必須的五種資訊 連線使用的協議,本地主機的ip位址,本地程序的協議埠,遠地主機的ip位址,...