生存不易,為了生活,為了money,自己必須強大起來。最近,馬上會迎來自己的面試高峰期,自己搜集了一些非常容易被面試官提及的iOS基礎面試題,特總結歸納并自己湊不要臉的回答一下(排序不分先后以及重要程度)。
Here we go!?
- TCP、UDP協議和區別?
TCP (Transmission Control Protocal, 傳輸控制協議):提供的是面向連接、可靠的字節流服務。當客戶Client和服務器Server彼此交換數據前,必須在雙方之間建立一個TCP連接,之后才可以傳輸數據。
UDP (User Data Protocal, 用戶數據報協議):是一個簡單的面向數據報的運輸層協議。UDP并不可靠,它只是把應用程序傳給IP層的數據報發送出去,但是并不能保證到達目的地。就是說我只管發,至于到不到,那我不能保證。傳輸過程無需建立連接,數據快于TCP。
這里側重說明一下TCP連接的三次“握手”:
1. 主機A向主機B發送連接請求數據包;
2. 主機B向主機A發送同意連接和要求同步(一個發送、一個接收,協調工作)的數據包;
3. 主機A向主機B發送確認同步數據包;
區別:
是否面向連接、傳輸是否可靠、傳輸數據量大小、速度快慢
- iOS內存管理機制 & ARC? ? ??
說明內存管理機制之前,先講一個經典的內存泄露的例子:
1) 一個對象創建并保留計數器的值為1的對象A;
2) 對象A創建并保留計數器的值為1的對象B并將其作為子對象;
3) 對象A創建了對象B,所以對象A擁有一個指向對象B的強引用;如果對象B有一個指向對象A的強引用,那么對象A的保留計數器的值會增加到2;
4) 當對象A的擁有者向對象A發送release消息,這樣會讓對象A的保留計數器的值減少到1;
這樣,由于對象A所創建的對象B的保留計數器的值仍為1,所以對象A和B都沒有被釋放掉,造成了內存泄露。
解決辦法:使用弱引用。
弱引用不會增加保留計數器的值,因此當對象A的擁有者釋放它的時候,它的保留計數器的值會變成0,它也會釋放對象B。
歸零弱引用:指向的對象釋放之后,這些弱引用就會被設置為零(即nil)。
__weak NSString *myString;
@property (weak) NSString *myString;
Cocoa的內存管理規則:
- 如果使用new、alloc或copy操作獲得一個對象,則該對象的保留計數器的值為1;
- 如果通過其他方法獲得一個對象,則假設該對象的保留計數器的值為1,而且已經被設置為自動釋放;
- 如果保留了某對象,則必須保持retain方法和release方法的使用次數相同;
ARC (automatic reference counting) 會在編譯過程中通過插入這些語句來幫組你執行保留或釋放操作。
copy,retain,assign的區別?
?copy:把原來的對象完整的賦值到另外一地方,重新加載一內存區,一個地方變了不影響另一個地方的對象。
?assign:簡單的直接賦值,相當于說兩個對象指向同個內存區,一個地方的變了,其他的也跟著改變。
?retain:釋放舊的對象,將舊對象的值賦予輸入對象,再提高輸入對象的索引計數為1
那上面的是什么意思呢?
copy其實是建立了一個相同的對象,而 retain 不是:
比如一個NSString對象,地址為0×1111,內容為@”ABC”;
copy 到另外一個NSString之 后,地址為0×2222,內容相同,新的對象retain 為 1,舊 有對象沒有變化;
retain 到另外一個NSString之 后,地址相同(建立一個指針,指針拷貝),內容當然相同,這個對象的 retain 值+1;
assign 地址還是0x1111,內容也還是“ABC”。
也就是說,retain 是指針拷貝,copy 是內容拷貝。
- KVO,Noification &Delegate 區別?
在功能上說,delegate、Notification以及KVO的功能類似,都是作用于OC中對象的消息通信。但三者的使用場景是不同的。簡單的說Delegate是一種回掉函數,更多的用在一對一的場合;Notification 用得較少,使用Notification Center,類似廣播方式,所以更適合一對多的通信;KVO,key-Value-Observing,觀察者模式,適用于偵聽另一對象的屬性的變化。
如何選擇KVO,Noification &Delegate?
請參考這里 IOS 如何選擇delegate、notification、KVO?