聲明:面試題系列都是 qq群大神群主 總結的一小部分
XMPP是什么
-XMPP:The Extensible Messaging and Presence Protocol(可擴展通訊和表示協議)
-XMPP是一種基于XML的即時通訊協議啊鸭,XMPP的官方文檔是RFC 3920
-XMPP是一個典型的C/S架構,基本的網絡形式是客戶端通過TCP/IP連接到服務器,
通過Socket建立連接薄辅,然后在Socket上傳輸XML流
-XMPP是一種類似于HTTP協議的一種數據傳輸協議,其過程就如同“解包裝--〉包裝”的過程蟀给。
只需要理解其接收的類型及返回的類型怔蚌,便可以很好的利用XMPP來進行數據通訊
-XMPP官方網站——http://xmpp.org
什么是FMDB
? FMDB是iOS平臺的SQLite數據庫框架
? FMDB以OC的方式封裝了SQLite的C語言API
? FMDB的優(yōu)點
? 使用起來更加面向對象,省去了很多麻煩虱饿、冗余的C語言代碼
? 提供了多線程安全的數據庫操作方法,有效地防止數據混亂
? FMDB的github地址
? https://github.com/ccgus/fmdb
核心類
? FMDB有三個主要的類
? FMDatabase
? 一個FMDatabase對象就代表一個單獨的SQLite數據庫
? 用來執(zhí)行SQL語句
? FMResultSet
? 使用FMDatabase執(zhí)行查詢后的結果集
? FMDatabaseQueue
? 用于在多線程中執(zhí)行多個查詢或更新触趴,它是線程安全的
Socket ------又稱"套接字”
網絡上的兩端通過建立一個雙向的通信連接實現數據的交換氮发,這個端就稱為一個Socket端。
應用程序通常通過"套接字"向網絡發(fā)出請求或者應答網絡請求
Paste_Image.png
網絡通信的要素
網絡上的請求就是通過Socket來建立連接然后互相通信
IP地址(網絡上主機設備的唯一標識)
端口號(定位程序)
用于標示進程的邏輯地址冗懦,不同進程的標示
有效端口:0~65535爽冕,其中0~1024由系統使用或者保留端口,開發(fā)中建議使用1024以上的端口
傳輸協議(用什么樣的方式進行交互)
通訊的規(guī)則
常見協議:TCP披蕉、UDP
TCP&UDP
TCP(傳輸控制協議)
建立連接颈畸,形成傳輸數據的通道
在連接中進行大數據傳輸(數據大小不收限制)
通過三次握手完成連接乌奇,是可靠協議,安全送達
必須建立連接眯娱,效率會稍低
UDP(用戶數據報協議)
將數據及源和目的封裝成數據包中礁苗,不需要建立連接
每個數據報的大小限制在64K之內
因為無需連接,因此是不可靠協議
不需要建立連接徙缴,速度快
runtime簡介
RunTime簡稱運行時试伙。OC就是運行時機制,也就是在運行時候的一些機制于样,其中最主要的是消息機制迁霎。
對于C語言,函數的調用在編譯的時候會決定調用哪個函數百宇。
對于OC的函數考廉,屬于動態(tài)調用過程,在編譯的時候并不能決定真正調用哪個函數携御,只有在真正運行的時候才會根據函數的名稱找到對應的函數來調用昌粤。
事實證明:
在編譯階段,OC可以調用任何函數啄刹,即使這個函數并未實現涮坐,只要聲明過就不會報錯。
在編譯階段誓军,C語言調用未實現的函數就會報錯袱讹。
runtime能干啥?
1昵时、發(fā)送消息
方法調用的本質捷雕,就是讓對象發(fā)送消息。
objc_msgSend,只有對象才能發(fā)送消息壹甥,因此以objc開頭.
objc_msgSend(p, @selector(eat));
2救巷、交換方法
獲取方法地址
Method imageWithName = class_getClassMethod(self,@selector(imageWithName:));
獲取系統方法地址
Method imageName = class_getClassMethod(self,@selector(imageNamed:));
交換方法地址,相當于交換實現方式
method_exchangeImplementations(imageWithName, imageName);
3句柠、動態(tài)添加方法
class_addMethod(self, @selector(eat), eat, "v@:");
4浦译、給分類添加屬性
5、 字典轉模型
線程與進程
NSThread
一個NSThread對象就代表一條線程
創(chuàng)建溯职、啟動線程
NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];
[thread start];
線程一啟動精盅,就會告訴 CPU 準備就緒,可以隨時接受CPU 調度! CPU 調度當前線程之后,就會在線程thread中執(zhí)行self的run方法
主線程相關用法
+ (NSThread*)mainThread; 獲得主線程
- (BOOL)isMainThread; 是否為主線程
+ (BOOL)isMainThread; 是否為主線程
GCD
全稱是Grand Central Dispatch,可譯為“牛逼的中樞調度器”
純C語言谜酒,提供了非常多強大的函數
GCD的優(yōu)勢
GCD是蘋果公司為多核的并行運算提出的解決方案
GCD會自動利用更多的CPU內核(比如雙核叹俏、四核)
GCD會自動管理線程的生命周期(創(chuàng)建線程、調度任務甚带、銷毀線程)
程序員只需要告訴GCD想要執(zhí)行什么任務她肯,不需要編寫任何線程管理代碼
任務和隊列
GCD中有2個核心概念
任務:執(zhí)行什么操作
隊列:用來存放任務
GCD的使用就2個步驟
定制任務
確定想做的事情
將任務添加到隊列中
GCD會自動將隊列中的任務取出佳头,放到對應的線程中執(zhí)行
KVO
KVO其實是一種觀察者模式鹰贵,利用它可以很容易實現視圖組件和數據模型的分離晴氨,當數據模型的屬性值改變之后作為監(jiān)聽器
的視圖組件就會被激發(fā),激發(fā)時就會回調監(jiān)聽器自身碉输。在ObjC中要實現KVO則必須實現NSKeyValueObServing協議籽前,不過幸運的是
NSObject已經實現了該協議,因此幾乎所有的ObjC對象都可以使用KVO敷钾。
在ObjC中使用KVO操作常用的方法如下:
注冊指定Key路徑的監(jiān)聽器: addObserver: forKeyPath: options: context:
刪除指定Key路徑的監(jiān)聽器: removeObserver: forKeyPath枝哄、removeObserver: forKeyPath: context:
回調監(jiān)聽:observeValueForKeyPath: ofObject: change: context:
KVO的使用步驟也比較簡單:
通過addObserver:
forKeyPath: options: context:為被監(jiān)聽對象(它通常是數據模型)注冊監(jiān)聽器
重寫監(jiān)聽器的observeValueForKeyPath:
ofObject: change: context:方法
你一般是如何優(yōu)化你的APP的?
一、首頁啟動速度
啟動過程中做的事情越少越好(盡可能將多個接口合并)
不在UI線程上作耗時的操作(數據的處理在子線程進行阻荒,處理完通知主線程刷新)
在合適的時機開始后臺任務(例如在用戶指引節(jié)目就可以開始準備加載的數據)
盡量減小包的大小
優(yōu)化方法:
量化啟動時間
啟動速度模塊化
輔助工具(友盟挠锥,聽云,Flurry)
二侨赡、頁面瀏覽速度
json的處理(iOS
自帶的NSJSONSerialization蓖租,Jsonkit,SBJson)
數據的分頁(后端數據多的話羊壹,就要分頁返回蓖宦,例如網易新聞,或者
微博記錄)
數據壓縮(大數據也可以壓縮返回油猫,減少流量稠茂,加快反應速度)
內容緩存(例如網易新聞的最新新聞列表都是要緩存到本地,從本地加載情妖,可以緩存到內存睬关,或者數據庫,根據情況而定)
延時加載tab(比如app有5個tab毡证,可以先加載第一個要顯示的tab共螺,其他的在顯示時候加載,按需加載)
算法的優(yōu)化(核心算法的優(yōu)化情竹,例如有些app
有個 聯系人姓名用漢語拼音的首字母排序)
三藐不、操作流暢度優(yōu)化:
Tableview
優(yōu)化(tableview cell的加載優(yōu)化)
ViewController加載優(yōu)化(不同view之間的跳轉,可以提前準備好數據)
四秦效、數據庫的優(yōu)化:
數據庫設計上面的重構
查詢語句的優(yōu)化
分庫分表(數據太多的時候雏蛮,可以分不同的表或者庫)
五、服務器端和客戶端的交互優(yōu)化:
客戶端盡量減少請求
服務端盡量做多的邏輯處理
服務器端和客戶端采取推拉結合的方式(可以利用一些同步機制)
通信協議的優(yōu)化阱州。(減少報文的大刑舯)
電量使用優(yōu)化(盡量不要使用后臺運行)
六、非技術性能優(yōu)化
產品設計的邏輯性(產品的設計一定要符合邏輯苔货,或者邏輯盡量簡單犀概,否則會讓程序員抓狂立哑,有時候用了好大力氣,才可以完成一個小小的邏輯設計問題)
界面交互的規(guī)范(每個模塊的界面的交互盡量統一姻灶,符合操作習慣)
代碼規(guī)范(這個可以隱形帶來app
性能的提高铛绰,比如 用if else 還是switch ,或者是用产喉!還是 ==)
code
review(堅持code Review 持續(xù)重構代碼捂掰。減少代碼的邏輯復雜度)
日常交流(經常分享一些代碼,或者邏輯處理中的坑)