最近親身經(jīng)歷面試,針對頻率高的問題做個(gè)小筆記,供小伙伴分享。
1.關(guān)于HTTP
HTTP定義了與服務(wù)器交互的基本方法。URL就是資源的地址、位置,互聯(lián)網(wǎng)上的每個(gè)資源都有一個(gè)唯一的URL,也稱之為資源描述符。
HTTP的作用主要在于:①規(guī)定客戶端和服務(wù)器之間的數(shù)據(jù)傳輸格式;②讓客戶端和服務(wù)器能有效地進(jìn)行數(shù)據(jù)溝通。
HTTP的優(yōu)點(diǎn):只所以選擇HTTP協(xié)議,是因?yàn)椋孩貶TTP協(xié)議簡單,所以HTTP服務(wù)器的程序規(guī)模小,因而通信速度很快;②HTTP允許傳輸任意類型的數(shù)據(jù);③使用非持續(xù)連接 限制每次連接只處理一個(gè)請求,服務(wù)器對客戶端的請求做出響應(yīng)后,馬上斷開連接,這種方式可以節(jié)省傳輸時(shí)間。
完整的http通信可以分為2大步驟:①請求:客戶端向服務(wù)器索要數(shù)據(jù);②響應(yīng):服務(wù)器返回客戶端相應(yīng)的數(shù)據(jù)。
最常用的請求方式:
?、貾OST:它將要發(fā)送的數(shù)據(jù)單獨(dú)放在一個(gè)流中進(jìn)行發(fā)送,而不是附加在URL地址后面,這樣做的好處是這些數(shù)據(jù)不會(huì)出現(xiàn)在URL地址中。
?、贕ET:它將要發(fā)送的數(shù)據(jù)直接添加在URL后面,如:www.sina.com.cn?username=""&password="",這樣的好處是可以直接將數(shù)據(jù)加在URL后,而不需在用另外的流來發(fā)送這些數(shù)據(jù),但是缺點(diǎn)也顯而易見,它將用戶的信息顯示出來了。
GET和POST對比:
?、貵ET在請求URL后面以?的形式跟上發(fā)給服務(wù)器的參數(shù),多個(gè)參數(shù)之間用&隔開,比如http://ww.test.com/login?username=maybo&pwd=123&type=JSON(URL后面附帶的參數(shù)是有限制的,通常不能超過1KB)。如果僅僅是索取數(shù)據(jù)(數(shù)據(jù)查詢),建議使用GET
?、诙鳳OST發(fā)給服務(wù)器的參數(shù)全部放在請求體中;POST傳遞的數(shù)據(jù)量沒有限制(具體還得看服務(wù)器的處理能力)。如果要傳遞大量數(shù)據(jù),比如文件上傳,只能用POST請求;GET的安全性比POST要差些,如果包含機(jī)密\敏感信息,建議用POST。如果是增加、修改、刪除數(shù)據(jù),建議使用POST。
iOS中發(fā)送HTTP請求的方案:
?、偬O果原生:NSURLConnection:用法簡單,最古老最經(jīng)典最直接的一種方案;NSURLSession:iOS 7新出的技術(shù),功能比NSURLConnection更加強(qiáng)大;CFNetwork:NSURL的底層,純C語言。
?、诘谌娇蚣蹵SIHttpRequest:外號“HTTP終結(jié)者”,功能極其強(qiáng)大,可惜早已停止更新AFNetworking:簡單易用,提供了基本夠用的常用功能。ASI和AFN架構(gòu)對比,AFN基于NSURL,ASI基于CFHTTP,ASI的性能更好一些。
2.關(guān)于socket
它是基于TCP/IP協(xié)議,Socket就是一個(gè)可以連通網(wǎng)絡(luò)上不同計(jì)算機(jī)程序之間的管道,把一堆數(shù)據(jù)從管道的一端扔進(jìn)去,則會(huì)從管道的另一端冒出來。管道的端又由兩個(gè)因素來唯一確認(rèn),即機(jī)器的IP地址和程序所使用的端口號。Socket可以支持?jǐn)?shù)據(jù)的發(fā)送和接收,它會(huì)定義一種稱為套接字的變量,發(fā)送數(shù)據(jù)時(shí)首先創(chuàng)建 套接字,然后使用該套接字的sendto等方法對準(zhǔn)某個(gè)IP/端又進(jìn)行數(shù)據(jù)發(fā)送;接收端也首先創(chuàng) 建套接字,然后將該套接字綁定到一個(gè)IP/端又上,所有發(fā)向此端又的數(shù)據(jù)會(huì)被該套接字的recv等函數(shù)讀出。如同讀出文件中的數(shù)據(jù)一樣。
TCP/IP的socket提供下列三種類型套接字。 流式套接字、數(shù)據(jù)報(bào)式套接字、原始式套接字。客戶端編程步驟:
1:加載套接字庫,創(chuàng)建套接字(WSAStartup()/socket());
2:向服務(wù)器發(fā)出連接請求(connect());
3:和服務(wù)器端進(jìn)行通信(send()/recv());
4:關(guān)閉套接字,關(guān)閉加載的套接字庫(closesocket()/WSACleanup())。常用第三方庫:Asyncsocket庫。
3.http和socket的區(qū)別
HTTP協(xié)議是基于TCP連接的,是應(yīng)用層協(xié)議,主要解決如何包裝數(shù)據(jù)。Socket是對TCP/IP協(xié)議的封裝,Socket本身并不是協(xié)議,而是一個(gè)調(diào)用接口(API),通過Socket,我們才能使用TCP/IP協(xié)議。
HTTP連接:短連接,客戶端向服務(wù)器發(fā)送一次請求,服務(wù)器響應(yīng)后連接斷開,節(jié)省資源。服務(wù)器不能主動(dòng)給客戶端響應(yīng)(除非采用HTTP長連接技術(shù)),iPhone主要使用類NSURLConnection。
Socket連接:長連接,客戶端跟服務(wù)器端直接使用Socket進(jìn)行連接,沒有規(guī)定連接后斷開,因此客戶端和服務(wù)器段保持連接通道,雙方可以主動(dòng)發(fā)送數(shù)據(jù),一般多用于游戲,股票等。Socket默認(rèn)連接超時(shí)時(shí)間是30秒,默認(rèn)大小是8K(理解為一個(gè)數(shù)據(jù)包大小)。主要使用類是CFSocketRef。
4.UDP 與TCP的區(qū)別
TCP協(xié)議和UDP協(xié)議是TCP/IP中最具有代表性的傳輸層協(xié)議。
UDP:是不具有可靠性的數(shù)據(jù)報(bào)協(xié)議。只確保發(fā)送消息,其他處理都由上層應(yīng)用來完成。主要用在實(shí)時(shí)性要求高以及對質(zhì)量相對較弱的地方,但面對現(xiàn)在高質(zhì)量的線路不是容易丟包除非是一些擁塞條件下。UDP只管發(fā)送,有數(shù)據(jù)包,無需通過三次握手這種方式來連接(傳輸速度快),每個(gè)數(shù)據(jù)報(bào)大小限制在64k。不太可靠。
UDP有哪些優(yōu)點(diǎn):①無需建立連接(減少延遲)②實(shí)現(xiàn)簡單:無需維護(hù)連接狀態(tài)③頭部開銷小④沒有擁塞控制:應(yīng)用可以更好的控制發(fā)送時(shí)間和發(fā)送速率。
UDP應(yīng)用場景:效率要求相對高,對準(zhǔn)確性要求相對低的場景。舉幾個(gè)例子:QQ聊天、在線視頻、網(wǎng)絡(luò)語音電話(即時(shí)通訊,速度要求高,但是出現(xiàn)偶爾斷續(xù)不是太大問題,并且此處完全不可以使用重發(fā)機(jī)制)、廣播通信(廣播、多播)。
TCP:面向連接、可靠的流協(xié)議。屬于傳輸控制協(xié)議:是面連接的,那么運(yùn)行環(huán)境必然要求其可靠性不可丟包??煽啃灾窽CP協(xié)議提供可靠性傳輸,實(shí)行“順序控制”或“重發(fā)控制”機(jī)制。此外還具有“流量控制”、“擁塞控制”提供網(wǎng)絡(luò)利用率等眾多功能。TCP通常通過三次握手建立連接(速度慢),比較可靠,數(shù)據(jù)大小沒有限制,多用于流媒體。(三次握手過程:①第一次握手:建立連接時(shí),客戶端發(fā)送同步序列編號到服務(wù)器,并進(jìn)入發(fā)送狀 態(tài),等待服務(wù)器確認(rèn);②第二次:服務(wù)器收到同步序列編號,確認(rèn)并同時(shí)自己也發(fā)送一個(gè)同步序列編號+確認(rèn)標(biāo)志,此時(shí)服務(wù)器進(jìn)入接收狀態(tài);③第三次:客戶端收到服務(wù)器發(fā)送的包,并向服務(wù)器發(fā)送確認(rèn)標(biāo)志,隨后鏈接成功。需要注意的是在鏈接成功后在進(jìn)行數(shù)據(jù)傳輸。)
TCP應(yīng)用場景:效率要求相對低,但對準(zhǔn)確性要求相對高的場景。因?yàn)閭鬏斨行枰獙?shù)據(jù)確認(rèn)、重發(fā)、排序等操作,相比之下效率沒有UDP高。舉幾個(gè)例子:文件傳輸(準(zhǔn)確高要求高、但是速度可以相對慢)、接受郵件、遠(yuǎn)程登錄。
5.通信底層原理(OSI七層模型)
OSI簡介:OSI采用了分層的結(jié)構(gòu)化技術(shù),共分七層,物理層、數(shù)據(jù)鏈路層、網(wǎng)絡(luò)層、傳輸層、會(huì)話層、表示層、應(yīng)用層。
6.關(guān)于AFN及SDWebImage
(AFN與SDWebImage的缺陷如何改進(jìn))
7.導(dǎo)致程序閃退的原因
1.函數(shù)無限遞歸
2.運(yùn)行時(shí),找不到方法(沒實(shí)現(xiàn))
3.訪問了某個(gè)已經(jīng)被釋放的對象
4.程序占用內(nèi)存或CPU過高
5.子線程阻塞主UI線程過久
6.從Bundle加載了不存在或者不支持的對象(圖片素材之類的)```
######定位閃退的位置
1.在設(shè)置斷點(diǎn)的地方,選Add Exception Breakpoint。之后crash就會(huì)停在出錯(cuò)的位置。
2.如果是在測試階段報(bào)錯(cuò)的話,可以在(設(shè)置-通用-關(guān)于本機(jī)-診斷與用量)里面看到崩潰的堆棧信息。
3.如果用rac的話,訪問到已經(jīng)釋放了的內(nèi)存,和內(nèi)存警告這2種出錯(cuò)幾率要高些。
####8.調(diào)試解決crash問題的思路及步驟
```1)把問題拆分成多個(gè)小問題,一步步檢驗(yàn),直到找到問題的根源點(diǎn)
2)程序運(yùn)行后,查看log信息,找到錯(cuò)誤的地方
3)在錯(cuò)誤的地方設(shè)置斷點(diǎn)進(jìn)行調(diào)試,可以加條件斷點(diǎn)
4)查看斷點(diǎn)運(yùn)行的信息,進(jìn)行修改
5) 如果是在測試階段報(bào)錯(cuò)的話,可以在(設(shè)置-通用-關(guān)于本機(jī)-診斷與用量)里面看到崩潰的堆棧信息。
6)如果用rac的話,訪問到已經(jīng)釋放了的內(nèi)存,和內(nèi)存警告這2種出錯(cuò)幾率要高些。```
####9.Runtime
運(yùn)行時(shí)本質(zhì)-消息機(jī)制,而消息機(jī)制原理:對象根據(jù)方法編號SEL去映射表查找對應(yīng)的方法實(shí)現(xiàn).調(diào)用流程: 1.首先獲取p對象的isa指針,就去isa指向類中查找 2.根據(jù)傳入SEL找到對應(yīng)方法名(函數(shù)入口) 3.直接調(diào)用函數(shù)實(shí)現(xiàn).
使用場景:交換系統(tǒng)的方法,動(dòng)態(tài)添加方法,給分類添加屬性,字典轉(zhuǎn)模型,clang編譯
####10.XMPP與環(huán)信
---未完待續(xù)--