1、說說你認識的Swift是什么?
? ? Swift是蘋果于2014年WWDC(蘋果開發者大會)發布的新開發語言,可與Objective-C共同運行于MAC OS和iOS平臺,用于搭建基于蘋果平臺的應用程序。
2、舉例說明Swift里面有哪些是 Objective-C中沒有的?
? ? Swift引入了在Objective-C中沒有的一些高級數據類型,例如tuples(元組),可以使你創建和傳遞一組數值。
? ? wift還引入了可選項類型(Optionals),用于處理變量值不存在的情況。可選項的意思有兩種:一是變量是存在的,
? ? 例如等于X,二是變量值根本不存在。Optionals類似于Objective-C中指向nil的指針,但是適用于所有的數據類型,而非僅僅局限于類,Optionals 相比于Objective-C中nil指針更加安全和簡明,并且也是Swift諸多最強大功能的核心。
3、NSArray與NSSet的區別?
? ? NSArray內存中存儲地址連續,而NSSet不連續
? ? NSSet效率高,內部使用hash查找;NSArray查找需要遍歷
? ? NSSet通過anyObject訪問元素,NSArray通過下標訪問
4、Swift比Objective-C有什么優勢?
Swift全面優于Objective-C語言,性能是Objective-C的1.3倍,上手更加容易。
5、NSHashTable與NSMapTable?
? ? NSHashTable是NSSet的通用版本,對元素弱引用,可變類型;可以在訪問成員時copy
? ? NSMapTable是NSDictionary的通用版本,對元素弱引用,可變類型;
? ? 可以在訪問成員時copy
? ? (注:NSHashTable與NSSet的區別:NSHashTable可以通過option設置元素弱引用/copyin,只有可變類? ? 型。但是添加對象的時候NSHashTable耗費時間是NSSet的兩倍。
? ? NSMapTable與NSDictionary的區別:同上)
6、Swift 是一門安全語言嗎?
? ? Swift是一門類型安全的語言,Optionals就是代表。Swift能幫助你在類型安全的環境下工作,如果你的代碼中需要使用String類型,Swift的安全機制能阻止你錯誤的將Int值傳遞過來,這使你在開發階段就能及時發現并修正問題。
7、屬性關鍵字assign、retain、weak、copy
? ? assign:用于基本數據類型和結構體。如果修飾對象的話,當銷毀時,屬性值不會自動置nil,可能造成野指針。
? ? weak:對象引用計數為0時,屬性值也會自動置nil
? ? retain:強引用類型,ARC下相當于strong,但block不能用retain修飾,因為等同于assign不安全。
? ? strong:強引用類型,修飾block時相當于copy。
8、weak屬性如何自動置nil的?
? ? Runtime會對weak屬性進行內存布局,構建hash表:以weak屬性對象內存地址為key,weak屬性值(weak自身地址)為value。當對象引用計數為0 dealloc時,會將weak屬性值自動置nil。
9、Swift 是一門安全語言嗎?
? ? Swift是一門類型安全的語言,Optionals就是代表。Swift能幫助你在類型安全的環境下工作,如果你的代碼中需要使用String類型,Swift的安全機制能阻止你錯誤的將Int值傳遞過來,這使你在開發階段就能及時發現并修正問題。
?10、內存泄露問題?
主要集中在循環引用問題中,如block、NSTime、perform selector引用計數問題。
11、Block的循環引用、內部修改外部變量、三種block
? ? block強引用self,self強引用block
? ? 內部修改外部變量:block不允許修改外部變量的值,這里的外部變量指的是棧中指針的內存地址。
__block的作用是只要觀察到變量被block使用,就將外部變量在棧中的內存地址放到堆中。
? ? 三種block:
? ? ? ? NSGlobalBlack(全局)、
? ? ? ? NSStackBlock(棧block)、
? ? ? ? NSMallocBlock(堆block)
12、KVO底層實現原理?手動觸發KVO?swift如何實現KVO?
? ? KVO原理:當觀察一個對象時,runtime會動態創建繼承自該對象的類,并重寫被觀察對象的setter方法,重寫的setter方法會負責在調用原setter方法前后通知所有觀察對象值得更改,最后會把該對象的isa指針指向這個創建的子類,對象就變成子類的實例。
? ? 如何手動觸發KVO:在setter方法里,手動實現NSObject兩個方法:willChangeValueForKey、didChangeValueForKey
? ? swift的kvo:繼承自NSObject的類,或者直接willset/didset實現。
13、categroy為什么不能添加屬性?怎么實現添加?與Extension的區別?category覆蓋原類方法?多個category調用順序
? ? Runtime初始化時categroy的內存布局已經確定,沒有ivar,所以默認不能添加屬性。
? ? 使用runtime的關聯對象,并重寫setter和getter方法。
? ? Extenstion編譯期創建,可以添加成員變量ivar,一般用作隱藏類的信息。必須要有類的源碼才可以添加,如NSString就不能創建Extension。
? ? category方法會在runtime初始化的時候copy到原來前面,調用分類方法的時候直接返回,不再調用原類。如何保持原類也調用(http://www.lxweimin.com/p/40e28c9f9da5)。
多個category的調用順序按照:Build Phases ->Complie Source 中的編譯順序。
14、load方法和initialize方法的異同。——主要說一下執行時間,各自用途,沒實現子類的方法會不會調用父類的?
? ? load initialize 調用時機 app啟動后,runtime初始化的時候 第一個方法調用前調用 調用順序 父類->本類->分類 父類->本類(如果有分類直接調用分類,本類不會調用) 沒實現子類的方法會不會調用父類的 否 是 是否沿用父類實現 否 是
見圖 1
15、對 runtime 的理解。——主要是方法調用時如何查找緩存,如何找到方法,找不到方法時怎么轉發,對象的內存布局
? ? OC中向對象發送消息時,runtime會根據對象的isa指針找到對象所屬的類,然后在該類的方法列表和父類的方法列表中尋找方法執行。如果在最頂層父類中沒找到方法執行,就會進行消息轉發:Method resoution(實現方法)、fast forwarding(轉發給其他對象)、normal forwarding(完整消息轉發。可以轉發給多個對象)
16、runtime 中,SEL和IMP的區別?
? ? 每個類對象都有一個方法列表,方法列表存儲方法名、方法實現、參數類型,SEL是方法名(編號),IMP指向方法實現的首地址
17、autoreleasepool的原理和使用場景?
? ? 若干個autoreleasepoolpage組成的雙向鏈表的棧結構,objc_autoreleasepoolpush、objc_autoreleasepoolpop、objc_autorelease
? ? 使用場景:多次創建臨時變量導致內存上漲時,需要延遲釋放
autoreleasepoolpage的內存結構:4k存儲大小
見圖 2
18、Autorelase對象什么時候釋放?
? ? 在沒有手加Autorelease Pool的情況下,Autorelease對象是在當前的runloop迭代結束時釋放的,而它能夠釋放的原因是系統在每個runloop迭代中都加入了自動釋放池Push和Pop。
19、Runloop與線程的關系?Runloop的mode? Runloop的作用?內部機制?
? ? 每一個線程都有一個runloop,主線程的runloop默認啟動。
? ? mode:主要用來指定事件在運行時循環的優先級
? ? 作用:保持程序的持續運行、隨時處理各種事件、節省cpu資源(沒事件休息釋放資源)、渲染屏幕UI
20、iOS中使用的鎖、死鎖的發生與避免
? ? @synchronized、信號量、NSLock等
? ? 死鎖:多個線程同時訪問同一資源,造成循環等待。GCD使用異步線程、并行隊列
21、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開銷相對高
22、App啟動優化策略?main函數執行前后怎么優化
? ? 啟動時間 = pre-main耗時+main耗時
? ? pre-main階段優化:
? ? ? ? 刪除無用代碼
? ? ? ? 抽象重復代碼
? ? ? ? +load方法做的事情延遲到initialize中,或者+load的事情不宜花費太多時間
? ? ? ? 減少不必要的framework,或者優化已有framework
? ? Main階段優化
? ? ? ? didFinishLauchingwithOptions里代碼延后執行
? ? ? ? 首次啟動渲染的頁面優化
23、Swift 支持面向過程編程嗎?
? ? 它采用了 Objective-C 的命名參數以及動態對象模型,可以無縫對接到現有的 Cocoa 框架,并且可以兼容 Objective-C 代碼,支持面向過程編程和面向對象編程
24、Swift 是一門安全語言嗎?
? ? Swift是一門類型安全的語言,Optionals就是代表。Swift能幫助你在類型安全的環境下工作,如果你的代碼中需要使用String類型,Swift的安全機制能阻止你錯誤的將Int值傳遞過來,這使你在開發階段就能及時發現并修正問題。
25、Swift中如何定義變量和常量?
使用let來聲明常量,使用var來聲明變量
26、oc與js交互
? ? 攔截url
? ? JavaScriptCore(只適用于UIWebView)
? ? WKScriptMessageHandler(只適用于WKWebView)
? ? WebViewJavaScriptBridge(第三方框架)
27、Swift的內存管理是怎樣的?
Swift 使用自動引用計數(Automatic Reference Counting, ARC)來簡化內存管理
28、struct、Class的區別
? ? class可以繼承,struct不可以
? ? class是引用類型,struct是值類型
? ? struct在function里修改property時需要mutating關鍵字修飾
29、訪問控制關鍵字(public、open、private、filePrivate、internal)
? ? public與open:public在module內部中,class和func都可以被訪問/重載/繼承,外部只能訪問;而open都可以
? ? private與filePrivate:private修飾class/func,表示只能在當前class源文件/func內部使用,外部不可以被繼承和訪問;而filePrivate表示只能在當前swift源文件內訪問
? ? internal:在整個模塊或者app內都可以訪問,默認訪問級別,可寫可不寫
30、OC與Swift混編
? ? OC調用swift:import "工程名-swift.h” @objc
? ? swift調用oc:橋接文件
31、用Swift定義一個數組和字典?
? ? let emptyArray = String[]()
? ? let emptyDictionary = Dictionary<String, Float>()
32、try、try?與try!
? ? try:手動捕捉異常
? ? try?:系統幫我們處理,出現異常返回nil;沒有異常返回對應的對象
? ? try!:直接告訴系統,該方法沒有異常。如果出現異常程序會crash
33、guard與defer
? ? guard用于提前處理錯誤數據,else退出程序,提高代碼可讀性
? ? defer延遲執行,回收資源。多個defer反序執行,嵌套defer先執行外層,后執行內層
34、架構&設計模式
? ? MVC設計模式介紹
? ? MVVM介紹、MVC與MVVM的區別?
? ? ReactiveCocoa的熱信號與冷信號
? ? 緩存架構設計LRU方案
? ? SDWebImage源碼,如何實現解碼
? ? AFNetWorking源碼分析
? ? 組件化的實施,中間件的設計
? ? 哈希表的實現原理?如何解決沖突
35、數據結構&算法
? ? 快速排序、歸并排序
? ? 二維數組查找(每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函數,輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該整數)
? ? 二叉樹的遍歷:判斷二叉樹的層數
? ? 單鏈表判斷環
36、內存泄露問題?
主要集中在循環引用問題中,如block、NSTime、perform selector引用計數問題。
37、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 (機制待改善))