文章分享至我的個人技術部落格:
講到這裡,runtime
的知識點和應用基本上就已經講完了, 剩下的就靠大家自己在專案中的應用以及累積了.
這一篇文章主要是
基礎路徑圖:
在學習runtime
的基礎時, 我們要搞清楚一些重要的東西, 一些專業術語:
我們可以從這些東西裡獲取到指定類的所有資訊, 無論是公開的, 還是私有的, 全部都可以拿到, 並且操作.
ps: 但操作私有方法的時候, 注意不要用來上架, 除非你有方法讓蘋果審核的時候通過.
高階路徑圖:
在學習runtime
高階的時候, 我們就要了解更加的深入.
訊息機制:
物件關聯:
物件關聯的策略:
動態方法解析:
應用路徑圖:
在學習完runtime
之後, 我們就可以應用到我們的實際開發中.
category
class
model
在實際開發中, 我們有一些例項場景會用到runtime
:
runtime method swizzling開發例項彙總
問題:objc在向乙個物件傳送訊息時, 發生了什麼?
1.根據物件的isa
指標找到類物件id
, 在查詢類物件裡面的methodlists
方法函式列表
2.如果沒有在好到, 在沿著superclass
, 尋找父類,再在父類methodlists
方法列表裡面查詢
3.最終找到sel
, 根據id
和sel
確認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_setvarlayout
或class_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位址,...