中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

高級iOS面試題有哪些

發布時間:2021-11-15 11:24:09 來源:億速云 閱讀:109 作者:iii 欄目:移動開發

這篇文章主要介紹“高級iOS面試題有哪些”,在日常操作中,相信很多人在高級iOS面試題有哪些問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”高級iOS面試題有哪些”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

1、NSArray與NSSet的區別?

  • NSArray內存中存儲地址連續,而NSSet不連續

  • NSSet效率高,內部使用hash查找;NSArray查找需要遍歷

  • NSSet通過anyObject訪問元素,NSArray通過下標訪問

2、NSHashTable與NSMapTable?

  • NSHashTable是NSSet的通用版本,對元素弱引用,可變類型;可以在訪問成員時copy

  • NSMapTable是NSDictionary的通用版本,對元素弱引用,可變類型;可以在訪問成員時copy

(注:NSHashTable與NSSet的區別:NSHashTable可以通過option設置元素弱引用/copyin,只有可變類型。但是添加對象的時候NSHashTable耗費時間是NSSet的兩倍。
NSMapTable與NSDictionary的區別:同上)

3、屬性關鍵字assign、retain、weak、copy

  • assign:用于基本數據類型和結構體。如果修飾對象的話,當銷毀時,屬性值不會自動置nil,可能造成野指針。

  • weak:對象引用計數為0時,屬性值也會自動置nil

  • retain:強引用類型,ARC下相當于strong,但block不能用retain修飾,因為等同于assign不安全。

  • strong:強引用類型,修飾block時相當于copy。

4、weak屬性如何自動置nil的?

  • Runtime會對weak屬性進行內存布局,構建hash表:以weak屬性對象內存地址為key,weak屬性值(weak自身地址)為value。當對象引用計數為0 dealloc時,會將weak屬性值自動置nil。

5、Block的循環引用、內部修改外部變量、三種block

  • block強引用self,self強引用block

  • 內部修改外部變量:block不允許修改外部變量的值,這里的外部變量指的是棧中指針的內存地址。__block的作用是只要觀察到變量被block使用,就將外部變量在棧中的內存地址放到堆中。

  • 三種block:NSGlobalBlack(全局)、NSStackBlock(棧block)、NSMallocBlock(堆block)

6、KVO底層實現原理?手動觸發KVO?swift如何實現KVO?

  • KVO原理:當觀察一個對象時,runtime會動態創建繼承自該對象的類,并重寫被觀察對象的setter方法,重寫的setter方法會負責在調用原setter方法前后通知所有觀察對象值得更改,最后會把該對象的isa指針指向這個創建的子類,對象就變成子類的實例。

  • 如何手動觸發KVO:在setter方法里,手動實現NSObject兩個方法:willChangeValueForKey、didChangeValueForKey

  • swift的kvo:繼承自NSObject的類,或者直接willset/didset實現。

7、categroy為什么不能添加屬性?怎么實現添加?與Extension的區別?category覆蓋原類方法?多個category調用順序

  • Runtime初始化時categroy的內存布局已經確定,沒有ivar,所以默認不能添加屬性。

  • 使用runtime的關聯對象,并重寫setter和getter方法。

  • Extenstion編譯期創建,可以添加成員變量ivar,一般用作隱藏類的信息。必須要有類的源碼才可以添加,如NSString就不能創建Extension。

  • category方法會在runtime初始化的時候copy到原來前面,調用分類方法的時候直接返回,不再調用原類。如何保持原類也調用( https://www.jianshu.com/p/40e28c9f9da5)。

  • 多個category的調用順序按照:Build Phases ->Complie Source 中的編譯順序。

8、load方法和initialize方法的異同。——主要說一下執行時間,各自用途,沒實現子類的方法會不會調用父類的?
load initialize 調用時機 app啟動后,runtime初始化的時候 第一個方法調用前調用 調用順序 父類->本類->分類 父類->本類(如果有分類直接調用分類,本類不會調用) 沒實現子類的方法會不會調用父類的 否 是 是否沿用父類實現 否 是

高級iOS面試題有哪些

image

9、對 runtime 的理解。——主要是方法調用時如何查找緩存,如何找到方法,找不到方法時怎么轉發,對象的內存布局

OC中向對象發送消息時,runtime會根據對象的isa指針找到對象所屬的類,然后在該類的方法列表和父類的方法列表中尋找方法執行。如果在最頂層父類中沒找到方法執行,就會進行消息轉發:Method resoution(實現方法)、fast forwarding(轉發給其他對象)、normal forwarding(完整消息轉發。可以轉發給多個對象)

10、runtime 中,SEL和IMP的區別?

每個類對象都有一個方法列表,方法列表存儲方法名、方法實現、參數類型,SEL是方法名(編號),IMP指向方法實現的首地址

11、autoreleasepool的原理和使用場景?

  • 若干個autoreleasepoolpage組成的雙向鏈表的棧結構,objc_autoreleasepoolpush、objc_autoreleasepoolpop、objc_autorelease

  • 使用場景:多次創建臨時變量導致內存上漲時,需要延遲釋放

  • autoreleasepoolpage的內存結構:4k存儲大小

高級iOS面試題有哪些

image

12、Autorelase對象什么時候釋放?

在沒有手加Autorelease Pool的情況下,Autorelease對象是在當前的runloop迭代結束時釋放的,而它能夠釋放的原因是系統在每個runloop迭代中都加入了自動釋放池Push和Pop。

13、Runloop與線程的關系?Runloop的mode? Runloop的作用?內部機制?

  • 每一個線程都有一個runloop,主線程的runloop默認啟動。

  • mode:主要用來指定事件在運行時循環的優先級

  • 作用:保持程序的持續運行、隨時處理各種事件、節省cpu資源(沒事件休息釋放資源)、渲染屏幕UI

14、iOS中使用的鎖、死鎖的發生與避免

  • @synchronized、信號量、NSLock等

  • 死鎖:多個線程同時訪問同一資源,造成循環等待。GCD使用異步線程、并行隊列

15、NSOperation和GCD的區別

  • GCD底層使用C語言編寫高效、NSOperation是對GCD的面向對象的封裝。對于特殊需求,如取消任務、設置任務優先級、任務狀態監聽,NSOperation使用起來更加方便。

  • NSOperation可以設置依賴關系,而GCD只能通過dispatch_barrier_async實現

  • NSOperation可以通過KVO觀察當前operation執行狀態(執行/取消)

  • NSOperation可以設置自身優先級(queuePriority)。GCD只能設置隊列優先級(DISPATCH_QUEUE_PRIORITY_DEFAULT),無法在執行的block中設置優先級

  • NSOperation可以自定義operation如NSInvationOperation/NSBlockOperation,而GCD執行任務可以自定義封裝但沒有那么高的代碼復用度

  • GCD高效,NSOperation開銷相對高

16、oc與js交互

  • 攔截url

  • JavaScriptCore(只適用于UIWebView)

  • WKScriptMessageHandler(只適用于WKWebView)

  • WebViewJavaScriptBridge(第三方框架)

17、swift相比OC有什么優勢?

18、struct、Class的區別

  • class可以繼承,struct不可以

  • class是引用類型,struct是值類型

  • struct在function里修改property時需要mutating關鍵字修飾

19、訪問控制關鍵字(public、open、private、filePrivate、internal)

  • public與open:public在module內部中,class和func都可以被訪問/重載/繼承,外部只能訪問;而open都可以

  • private與filePrivate:private修飾class/func,表示只能在當前class源文件/func內部使用,外部不可以被繼承和訪問;而filePrivate表示只能在當前swift源文件內訪問

  • internal:在整個模塊或者app內都可以訪問,默認訪問級別,可寫可不寫

20、OC與Swift混編

  • OC調用swift:import "工程名-swift.h” @objc

  • swift調用oc:橋接文件

21、map、filter、reduce?map與flapmap的區別?

  • map:數組中每個元素都經過某個方法轉換,最后返回新的數組(xx.map({高級iOS面試題有哪些0}))

  • flatmap:同map類似,區別在flatmap返回的數組不存在nil,并且會把optional解包;而且還可以把嵌套的數組打開變成一個([[1,2],[2,3,4],[5,6]] ->[1,2,2,3,4,5,6])

  • filter:用戶篩選元素(xxx.filter({$0 > 25}),篩選出大于25的元素組成新數組)

  • reduce:把數組元素組合計算為一個值,并接收初始值()

高級iOS面試題有哪些

image

22、guard與defer

  • guard用于提前處理錯誤數據,else退出程序,提高代碼可讀性

  • defer延遲執行,回收資源。多個defer反序執行,嵌套defer先執行外層,后執行內層

23、try、try?與try!

  • try:手動捕捉異常

  • try?:系統幫我們處理,出現異常返回nil;沒有異常返回對應的對象

  • try!:直接告訴系統,該方法沒有異常。如果出現異常程序會crash

24、@autoclosure:把一個表達式自動封裝成閉包

25、throws與rethrows:throws另一個throws時,將前者改為rethrows

26、App啟動優化策略?main函數執行前后怎么優化

  • 啟動時間 = pre-main耗時+main耗時

  • pre-main階段優化:

  • 刪除無用代碼

  • 抽象重復代碼

  • +load方法做的事情延遲到initialize中,或者+load的事情不宜花費太多時間

  • 減少不必要的framework,或者優化已有framework

  • Main階段優化

  • didFinishLauchingwithOptions里代碼延后執行

  • 首次啟動渲染的頁面優化

27、crash防護?

  • unrecognized selector crash

  • KVO crash

  • NSNotification crash

  • NSTimer crash

  • Container crash(數組越界,插nil等)

  • NSString crash (字符串操作的crash)

  • Bad Access crash (野指針)

  • UI not on Main Thread Crash (非主線程刷UI (機制待改善))

28、內存泄露問題?

主要集中在循環引用問題中,如block、NSTime、perform selector引用計數問題。

29、UI卡頓優化?

30、架構&設計模式

  • MVC設計模式介紹

  • MVVM介紹、MVC與MVVM的區別?

  • ReactiveCocoa的熱信號與冷信號

  • 緩存架構設計LRU方案

  • SDWebImage源碼,如何實現解碼

  • AFNetWorking源碼分析

  • 組件化的實施,中間件的設計

  • 哈希表的實現原理?如何解決沖突

31、數據結構&算法

  • 快速排序、歸并排序

  • 二維數組查找(每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函數,輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該整數)

  • 二叉樹的遍歷:判斷二叉樹的層數

  • 單鏈表判斷環

32、計算機基礎

  1. http與https?socket編程?tcp、udp?get與post?

  2. tcp三次握手與四次握手

  3. 進程與線程的區別

到此,關于“高級iOS面試題有哪些”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

ios
AI

道孚县| 苗栗县| 武邑县| 旬阳县| 晋城| 长兴县| 麻江县| 舞钢市| 庆云县| 稷山县| 改则县| 集贤县| 新巴尔虎右旗| 襄垣县| 彝良县| 奉新县| 平远县| 云霄县| 唐河县| 措美县| 金门县| 南京市| 潮安县| 林芝县| 保山市| 清河县| 磐安县| 南阳市| 高邑县| 墨脱县| 鹿邑县| 黎川县| 宁武县| 哈密市| 丹棱县| 延津县| 巴彦县| 博湖县| 麻城市| 新源县| 临沂市|