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