【iOS面試總結】疫情隔離中,線上面試的問題集合(第二部分)
接上文【iOS面試總結】疫情隔離中,線上面試的問題集合(第一部分)
6、Runtime
6.1 介紹下Runtime?
oc是一門動態語言,所謂動態語言就是在編譯階段無法確定呼叫的函式以及屬性的型別,只有在執行階段首次確定型別和呼叫的函式。
runtime就是動態語言下核心的一個庫,底層都會通過obj_sendMsg來處理訊息轉發機制。也是因為擁有runtime使得oc語言靈活性比較強,能夠具有動態、動態繫結、動態解析的特性。
總結:可在程式在執行時改變結構,如新增方法,交換方法等。
6.2 runtime呼叫流程?
1、當呼叫個物件的時候,會通過obj_oject的isa指標找對對應的歸屬類。
2、從歸屬類(obj_class)類中的obj_cache中尋找對應的相等的sel方法編號。
3、如果沒有找到,繼續obj_class中的obj_method_lish中查詢,如果找到寫入obj_cache中。
4、如果沒有到找到,會一直找到它的元類上。
5、如果元類也沒有的話,會呼叫訊息動態解析方法(resovleInstace和resloveClass)的方法,檢視是否存在繫結的方法。
6、如果沒有繫結方法,會呼叫訊息轉發方法(forwardingTagert)的方法。檢視是否存在轉發物件。
7、如果沒有存在訊息轉發物件,會呼叫(methodSinature)的方法,檢視是否有方法簽名返回型別和引數型別。
8、如果不存在簽名方法和型別,就會崩潰,找不到方法。
9、存在簽名的方法,就是繼續執行forwardingInvocation方法,最後一次通知繫結物件尋找IMP地址。
10、如果在forwardingInvocation沒有找到IMP,就會呼叫找不到方法。
6.3 訊息傳送的流程是怎樣的?
OC中的方法呼叫會轉化成給物件傳送訊息,傳送訊息會呼叫這個方法:
objc_msgSend(receiver, @selector(message))
該過程有以下關鍵步驟:
1、先確定呼叫方法的類已經都載入完畢,如果沒載入完畢的話進行載入
2、從cache中查詢方法
3、cache中沒有找到對應的方法,則到方法列表中查,查到則快取
4、如果本類中查詢到沒有結果,則遍歷所有父類重複上面的查詢過程,直到NSObject
6.4 runtime如何通過selector找到對應的IMP地址?
每一個類物件中都一個方法列表,方法列表中記錄著方法的名稱,方法實現,以及引數型別,其實selector本質就是方法名稱,通過這個方法名稱就可以在方法列表中找到對應的方法實現.
7、Runloop
8、Block
9、App與H5互動
10、設計模式
11、MVC 和 MVVM
12、iOS基礎知識掌握