接上文【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