【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

      7.1 Runloop的運行模式有哪些?    

        RunLoop的運行模式共有5種,RunLoop只會運行在一個模式下,要切換模式,就要暫停當前模式,重寫啓動一個運行模式

        1、kCFRunLoopDefaultMode, App的默認運行模式,通常主線程是在這個運行模式下運行

        2、UITrackingRunLoopMode, 跟蹤用戶交互事件(用於 ScrollView 追蹤觸摸滑動,保證界面滑動時不受其他Mode影響)

        3、kCFRunLoopCommonModes, 僞模式,不是一種真正的運行模式

        4、UIInitializationRunLoopMode:在剛啓動App時第進入的第一個Mode,啓動完成後就不再使用

        5、GSEventReceiveRunLoopMode:接受系統內部事件,通常用不到

     7.2 介紹下Runloop的內部邏輯 

    

  8、Block

     8.1 開發中Block有哪幾種形式?        

        8.1.1 全局 Block

        當我們聲明一個block時,如果這個block沒有捕獲外部的變量,那麼這個block就位於全局區,此時對NSGlobalBlock的retain、copy、release操作都無效。ARC和MRC環境下都是如此。

         8.1.2 棧 Block

        如果我們在聲明一個block的時候,使用了__weak或者__unsafe__unretained的修飾符,那麼系統就不會爲我們做copy的操作,不會將其遷移到堆區。

        8.1.3 堆 Block

        在ARC環境下,__strong修飾的(默認)block只要捕獲了外部變量就會位於堆區,NSMallocBlock支持retain、release,會對其引用計數+1或 -1。

  9、App與H5交互

 

  10、設計模式

 

  11、MVC 和 MVVM

 

  12、iOS基礎知識掌握

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章