一、NSArray與NSSet的區別?算法
- NSArray內存中存儲地址連續,而NSSet不連續
- NSSet效率高,內部使用hash查找;NSArray查找須要遍歷
- NSSet經過anyObject訪問元素,NSArray經過下標訪問
二、NSHashTable與NSMapTable?編程
- NSHashTable是NSSet的通用版本,對元素弱引用,可變類型;能夠在訪問成員時copy
- NSMapTable是NSDictionary的通用版本,對元素弱引用,可變類型;能夠在訪問成員時copy
(注:NSHashTable與NSSet的區別:NSHashTable能夠經過option設置元素弱引用/copyin,只有可變類型。可是添加對象的時候NSHashTable耗費時間是NSSet的兩倍。
NSMapTable與NSDictionary的區別:同上) swift
三、屬性關鍵字assign、retain、weak、copy設計模式
- assign:用於基本數據類型和結構體。若是修飾對象的話,當銷燬時,屬性值不會自動置nil,可能形成野指針。
- weak:對象引用計數爲0時,屬性值也會自動置nil
- retain:強引用類型,ARC下至關於strong,但block不能用retain修飾,由於等同於assign不安全。
- strong:強引用類型,修飾block時至關於copy。
四、weak屬性如何自動置nil的?數組
- Runtime會對weak屬性進行內存佈局,構建hash表:以weak屬性對象內存地址爲key,weak屬性值(weak自身地址)爲value。當對象引用計數爲0 dealloc時,會將weak屬性值自動置nil。
五、Block的循環引用、內部修改外部變量、三種block緩存
- block強引用self,self強引用block
- 內部修改外部變量:block不容許修改外部變量的值,這裏的外部變量指的是棧中指針的內存地址。__block的做用是隻要觀察到變量被block使用,就將外部變量在棧中的內存地址放到堆中。
- 三種block:NSGlobalBlack(全局)、NSStackBlock(棧block)、NSMallocBlock(堆block)
六、KVO底層實現原理?手動觸發KVO?swift如何實現KVO?安全
- KVO原理:當觀察一個對象時,runtime會動態建立繼承自該對象的類,並重寫被觀察對象的setter方法,重寫的setter方法會負責在調用原setter方法先後通知全部觀察對象值得更改,最後會把該對象的isa指針指向這個建立的子類,對象就變成子類的實例。
- 如何手動觸發KVO:在setter方法裏,手動實現NSObject兩個方法:willChangeValueForKey、didChangeValueForKey
- swift的kvo:繼承自NSObject的類,或者直接willset/didset實現。
七、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 中的編譯順序。
八、load方法和initialize方法的異同。——主要說一下執行時間,各自用途,沒實現子類的方法會不會調用父類的?
load initialize 調用時機 app啓動後,runtime初始化的時候 第一個方法調用前調用 調用順序 父類->本類->分類 父類->本類(若是有分類直接調用分類,本類不會調用) 沒實現子類的方法會不會調用父類的 否 是 是否沿用父類實現 否 是閉包
九、對 runtime 的理解。——主要是方法調用時如何查找緩存,如何找到方法,找不到方法時怎麼轉發,對象的內存佈局架構
OC中向對象發送消息時,runtime會根據對象的isa指針找到對象所屬的類,而後在該類的方法列表和父類的方法列表中尋找方法執行。若是在最頂層父類中沒找到方法執行,就會進行消息轉發:Method resoution(實現方法)、fast forwarding(轉發給其餘對象)、normal forwarding(完整消息轉發。能夠轉發給多個對象)
十、runtime 中,SEL和IMP的區別?
每一個類對象都有一個方法列表,方法列表存儲方法名、方法實現、參數類型,SEL是方法名(編號),IMP指向方法實現的首地址
十一、autoreleasepool的原理和使用場景?
- 若干個autoreleasepoolpage組成的雙向鏈表的棧結構,objc_autoreleasepoolpush、objc_autoreleasepoolpop、objc_autorelease
- 使用場景:屢次建立臨時變量致使內存上漲時,須要延遲釋放
- autoreleasepoolpage的內存結構:4k存儲大小
十二、Autorelase對象何時釋放?
在沒有手加Autorelease Pool的狀況下,Autorelease對象是在當前的runloop迭代結束時釋放的,而它可以釋放的緣由是系統在每一個runloop迭代中都加入了自動釋放池Push和Pop。
1三、Runloop與線程的關係?Runloop的mode? Runloop的做用?內部機制?
- 每個線程都有一個runloop,主線程的runloop默認啓動。
- mode:主要用來指定事件在運行時循環的優先級
- 做用:保持程序的持續運行、隨時處理各類事件、節省cpu資源(沒事件休息釋放資源)、渲染屏幕UI
1四、iOS中使用的鎖、死鎖的發生與避免
- @synchronized、信號量、NSLock等
- 死鎖:多個線程同時訪問同一資源,形成循環等待。GCD使用異步線程、並行隊列
1五、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開銷相對高
1六、oc與js交互
- 攔截url
- JavaScriptCore(只適用於UIWebView)
- WKScriptMessageHandler(只適用於WKWebView)
- WebViewJavaScriptBridge(第三方框架)
1七、swift相比OC有什麼優點?
1八、struct、Class的區別
- class能夠繼承,struct不能夠
- class是引用類型,struct是值類型
- struct在function裏修改property時須要mutating關鍵字修飾
1九、訪問控制關鍵字(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:橋接文件
2一、map、filter、reduce?map與flapmap的區別?
- map:數組中每一個元素都通過某個方法轉換,最後返回新的數組(xx.map({$0 \* $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:把數組元素組合計算爲一個值,並接收初始值()
2二、guard與defer
- guard用於提早處理錯誤數據,else退出程序,提升代碼可讀性
- defer延遲執行,回收資源。多個defer反序執行,嵌套defer先執行外層,後執行內層
2三、try、try?與try!
- try:手動捕捉異常
- try?:系統幫咱們處理,出現異常返回nil;沒有異常返回對應的對象
- try!:直接告訴系統,該方法沒有異常。若是出現異常程序會crash
2四、@autoclosure:把一個表達式自動封裝成閉包
2五、throws與rethrows:throws另外一個throws時,將前者改成rethrows
2六、App啓動優化策略?main函數執行先後怎麼優化
- 啓動時間 = pre-main耗時+main耗時
- pre-main階段優化:
- 刪除無用代碼
- 抽象重複代碼
- +load方法作的事情延遲到initialize中,或者+load的事情不宜花費太多時間
- 減小沒必要要的framework,或者優化已有framework
- Main階段優化
- didFinishLauchingwithOptions裏代碼延後執行
- 首次啓動渲染的頁面優化
2七、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 (機制待改善))
2八、內存泄露問題?
主要集中在循環引用問題中,如block、NSTime、perform selector引用計數問題。
2九、UI卡頓優化?
30、架構&設計模式
- MVC設計模式介紹
- MVVM介紹、MVC與MVVM的區別?
- ReactiveCocoa的熱信號與冷信號
- 緩存架構設計LRU方案
- SDWebImage源碼,如何實現解碼
- AFNetWorking源碼分析
- 組件化的實施,中間件的設計
- 哈希表的實現原理?如何解決衝突
3一、數據結構&算法
- 快速排序、歸併排序
- 二維數組查找(每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函數,輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該整數)
- 二叉樹的遍歷:判斷二叉樹的層數
- 單鏈表判斷環
3二、計算機基礎
- http與https?socket編程?tcp、udp?get與post?
- tcp三次握手與四次握手
- 進程與線程的區別