1.常用的設(shè)計模式
單例模式
組合模式
觀察者模式
代理模式
享元模式
工廠方法模式
抽象工廠模式
2.MVC 的理解
數(shù)據(jù)管理者(M)、數(shù)據(jù)展示者(V)、數(shù)據(jù)加工者(C)
M 應(yīng)該做的事:
給 ViewController 提供數(shù)據(jù)
給 ViewController 存儲數(shù)據(jù)提供接口
提供經(jīng)過抽象的業(yè)務(wù)基本組件,供 Controller 調(diào)度
C 應(yīng)該做的事:
管理 View Container 的生命周期
負(fù)責(zé)生成所有的 View 實例,并放入 View Container
監(jiān)聽來自 View 與業(yè)務(wù)有關(guān)的事件,通過與 Model 的合作,來完成對應(yīng)事件的業(yè)務(wù)。
V 應(yīng)該做的事:
響應(yīng)與業(yè)務(wù)無關(guān)的事件,并因此引發(fā)動畫效果,點擊反饋(如果合適的話,盡量還是放在 View 去做)等。
界面元素表達
3.MVC 和 MVVM 的區(qū)別
MVVM 是對胖模型進行的拆分,其本質(zhì)是給控制器減負(fù),將一些弱業(yè)務(wù)邏輯放到 VM 中處理
MVC 是一切設(shè)計的基礎(chǔ),所有新的設(shè)計模式都是基于 MVC 進行的改進
補充:常見的設(shè)計模式有:MVC、MVCS、MVVM、viper
4.TCP 和 UDP 有什么區(qū)別?
TCP 是面向連接的,建立連接需要經(jīng)歷三次握手,保證數(shù)據(jù)正確性和數(shù)據(jù)順序
UDP 是非連接的協(xié)議,傳送數(shù)據(jù)受生成速度,傳輸帶寬等限制,可能造成丟包
UDP 一臺服務(wù)端可以同時向多個客戶端傳輸信息
TCP 報頭體積更大,對系統(tǒng)資源要求更多
5.TCP 的三次握手
第一次握手:客戶端發(fā)送 syn 包到服務(wù)器,并進入 syn_send狀態(tài),等待服務(wù)器進行確認(rèn);
第二次握手:服務(wù)器收到客戶端的 syn 包,必須確認(rèn)客戶的SYN,同時自己也發(fā)送一個 SYN 包,即 SYN + ACK 包,此時服務(wù)器進入 SYN_RECV 狀態(tài);
第三次握手:客戶收到服務(wù)器發(fā)送的 SYN+ACK 包之后,向服務(wù)器發(fā)送確認(rèn)包, 此包發(fā)送完畢,客戶端和服務(wù)器進入ESTABLISHED 狀態(tài),完成第三次握手。
6.如何制作一個靜態(tài)庫/動態(tài)庫?他們的區(qū)別是什么?
Xcode6 支持制作靜態(tài)庫/動態(tài)庫 framework
無論是動態(tài)庫還是靜態(tài)庫都是區(qū)分真機和模擬器的靜態(tài)庫編譯靜態(tài)庫文件裝入程序空間,動態(tài)庫是文件動態(tài)裝入內(nèi)存,動態(tài)庫執(zhí)行到相關(guān)函數(shù)才會被調(diào)用,節(jié)省空間 。
蘋果一般不允許第三方動態(tài)庫,APP 容易被拒
7. 一個 lib 包含了很多的架構(gòu),會打到最后的包里么?
不會 , 如果lib中有armv7,armv7s,arm64,i386,x86_64 架 構(gòu) , 而 target architecture 選擇了armv7s,arm64,那么只會從 lib 中 link 指定的這兩個架構(gòu)的二進制代碼,其他架構(gòu)下的代碼不會 link 到最終可執(zhí)行文件中;反過來,一個 lib 需要在模擬器環(huán)境中正常 link,也得包含 i386 架構(gòu)的指令
每一個設(shè)備都有屬于自己的 CPU架構(gòu)
每一個靜態(tài)支持的架構(gòu)是固定的
模擬器
4s-->5 : i386
5s-->6plus : x86_64
真機
3gs-->4s : armv7
5/5c : armv7s,靜態(tài)庫只要支持了 armv7,就可以跑在 armv7s的架構(gòu)上
5s-->6plus : arm64
8.常用命令總結(jié):
// 使用 lipo -info命令,查看指定庫支持的架構(gòu),比如 UIKit框架
lipo -info UIKit.framework/UIKit
// 想看的更詳細(xì)的信息可以使用 lipo -detailed_info
lipo -detailed_info UIKit.framework/UIKit
// 還可以使用 file命令
file UIKit.framework/UIKit
// 合并 MyLib-32.a和 MyLib-64.a,可以使用 lipo -create命令
合并
lipo -create MyLib-32.a MyLib-64.a -output MyLib.a
9.支持 64-bit 后程序包會變大么?
會,支持 64-bit 后,多了一個 arm64 架構(gòu),理論上每個架構(gòu)一套指令,但相比原來會大多少還不好說
10.用過 Core Data 或者 SQLite 嗎?讀寫是分線程的嗎?遇到過死鎖沒?如何解決的?
用過 SQLite,使用 FMDB 框架
丟給 FMDatabaseQueue 或者添加互斥鎖(NSLock/@synchronized(鎖對象))
11.請簡單的介紹下 APNS 發(fā)送系統(tǒng)消息的機制
APNS 優(yōu)勢:杜絕了類似安卓那種為了接受通知不停在后臺喚醒程序保持長連接的行為,由 iOS 系統(tǒng)和 APNS 進行長連替代
APNS 的原理:
應(yīng)用在通知中心注冊,由 iOS 系統(tǒng)向 APNS 請求返回設(shè)備令牌(device Token)
應(yīng)用程序接收到設(shè)備令牌并發(fā)送給自己的后臺服務(wù)器
服務(wù)器把要推送的內(nèi)容和設(shè)備發(fā)送給 APNS
APNS 根據(jù)設(shè)備令牌找到設(shè)備,再由 iOS 根據(jù) APPID 把推送內(nèi)容展示
12.不用中間變量,用兩種方法交換 A 和 B 的值
方法 1:A = A + B
B = A - B
A = A - B
方法 2:異或 A = A^B;
B = A^B;
A = A^B;