您好,登錄后才能下訂單哦!
這篇文章主要介紹“高級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初始化的時候 第一個方法調用前調用 調用順序 父類->本類->分類 父類->本類(如果有分類直接調用分類,本類不會調用) 沒實現子類的方法會不會調用父類的 否 是 是否沿用父類實現 否 是
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存儲大小
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({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:把數組元素組合計算為一個值,并接收初始值()
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、計算機基礎
http與https?socket編程?tcp、udp?get與post?
tcp三次握手與四次握手
進程與線程的區別
到此,關于“高級iOS面試題有哪些”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。