1. 程式人生 > 其它 >【iOS面試總結】疫情隔離中,線上面試的問題集合(第二部分)

【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基礎知識掌握