一. 什么是動態綁定
動態綁定是指在執行期間(非編譯期)判斷所引用對象的實際類型,根據其實際的類型調用其相應的方法.程序運行的過程中,把函數調用與響應調用所需要的代碼想結合的過程為動態綁定
二. 什么是協議?分幾層?
通訊協議采用了4層的層級結構,每一層都呼叫一下層所提供的網絡來完成自己的需求.這4層分別為:
- 應用層:應用程序間溝通的層,如簡單電子郵件傳輸(SMTP).文件傳輸協議(FTP).網絡遠程訪問協議(Telnet)等.
- 傳輸層:在此層中,它提供了節點間的數據傳送服務,如傳輸控制協議(TCP).用戶數據協議(UDP)等.TCP和UDP給數據包加入傳輸數據并把它傳輸到下一層中,這一層負責傳送數據,并且確定數據已被傳送
- 互聯網絡層: 負責提供基本的數據封包傳送功能,讓每一塊數據包都能夠達到目的主機(但不檢查是否被正確傳送),如網絡協議(IP).
- 網絡接口層:對實際的網絡媒體管理.定義如何使用實際網絡(如Ethernet Serial Line等)來傳送數據
三. TCP和UDP的區別?這兩包的字節內容有啥不同?
TCP(Transmission Control Protocol,傳輸控制協議)
TCP是基于鏈接的協議,也就是說,在正是收發數據前,必須和對方建立可靠的鏈接.一個TCP鏈接必須要經過三次"對話"才能建立起來,其中的過程非常復雜,簡單介紹:主機A向主機B發出鏈接請求數據包"我給你發數據,可以嗎?"這是第一次對話;主機B??主機A發送同意鏈接和要求同步(同步就是兩臺主機一個在發送,一個在介紹,協調工作)的數據包:"可以",這是第二次對話;主機A再發出一個數據包確認主機B的要求同步;"我發的 你接著",這是第三次對話. 三次對話的目的是使數據包發送和接受同步,經過三次對話后,主機才向主機B正是發送數據.
UDP(User Data Protocol,用戶數據報協議)
UDP是與TCP相對應的協議.它是面向非連接的協議,它不與對方建立連接,而是直接就把數據包發送過去!
UDP適合用于一次只傳送少量的數據,對可靠性要求不高的應用環境,比如,我們經常使用"ping"命令來測試兩臺主機之間TCP/IP通信是否正常.其實"ping"命令的原理就想對方主機發送UDP數據包,然后對方主機確認收到數據包,如果數據包是否到達的消息及時反饋回來,那么網絡就是通的。正因為UDP協議沒有連接的過程,所以它的通信效果高;但也正因為如此,它的可靠性不如TCP協議高。QQ就使用UDP發消息,因此有時會出現收不到消息的情況。
四. 你是否接觸過OC中的反射機制?
NSObject常用的方法:
判斷一個類是否屬于某個類或者是它的子類
- (BOOL)isKindOfClass:(Class)aClass;
判斷一個類對象是否為一個類的實例(不包括子類)
- (BOOL)isMemberOfClass:(Class)aClass
Class的反射
- 根據字符串創建一個類
Class class = NSClassFromString(@“Student”)
Student *st= [class alloc]init] - 將類名改為字符串
Class class = [Student class];
NSString *str = NSStringFromClass(class);
SEL的反射
通過方法的字符串形式實例化方法
SEL sel = NSSelectorFromString(@“setName:”);
[st performSelector:sel withObject:@“Mike”];
將方法變成字符串
NSStringFromSelector(@selector(setName:));
五.C和Obj-c如何混用
- obj-c的編譯器處理后綴為m的文件時,可以識別obj-c和c的代碼, 處理mm文件可以識別obj-c,c,c++代碼,但cpp文件必須只能用c/c++代碼,而且cpp文件include的頭文件中,也不能出現obj- c的代碼,因為cpp只是cpp
- 在mm文件中混用cpp直接使用即可,所以obj-c混cpp不是問題
- 在cpp中混用obj- c其實就是使用obj-c編寫的模塊是我們想要的。
如果模塊以類實現,那么要按照cpp class的標準寫類的定義,頭文件中不能出現obj-c的東西,包括#import cocoa的。實現文件中,即類的實現代碼中可以使用obj-c的東西,可以import,只是后綴是mm。
如果模塊以函數實現,那么頭文件要按 c的格式聲明函數,實現文件中,c++函數內部可以用obj-c,但后綴還是mm或m。
總結:只要cpp文件和cpp include的文件中不包含obj-c的東西就可以用了,cpp混用obj-c的關鍵是使用接口,而不能直接使用實現代碼,實際上cpp混用的是 obj-c編譯后的o文件,這個東西其實是無差別的,所以可以用。obj-c的編譯器支持cpp.
六. 談談runtime機制
- runtime,運行時機制,它是一套C語言庫
- 實際上我們編寫的所有OC代碼,最終都是轉成了runtime庫的東西,比如類轉成了runtime庫里面的結構體等數據類型,方法轉成了runtime庫里面的C語言函數,平時調方法都是轉成了objc_msgSend函數(所以說OC有個消息發送機制)
- 因此,可以說runtime是OC的底層實現,是OC的幕后執行者
- 有了runtime庫,能做什么事情呢?runtime庫里面包含了跟類、成員變量、方法相關的API,比如獲取類里面的所有成員變量,為類動態添加成員變量,動態改變類的方法實現,為類動態添加新的方法等
- KVO是runtime的一個典型應用
七. AFN 與 ASI 有什么區別
- AFN基于NSURL,ASI基于底層的CFNetwork框架,因此ASI的性能優于AFN
- AFN采取block的方式處理請求,ASI最初采取delegate的方式處理請求,后面也增加了block的方式
- AFN只封裝了一些常用功能,滿足基本需求,直接忽略了很多擴展功能,比如沒有封裝同步請求;ASI提供的功能較多,預留了各種接口和工具供開發者自行擴展
- AFN直接解析服務器返回的JSON、XML等數據,而ASI比較原始,返回的是NSData二進制數據
八. 如果后期需要增加數據庫中的字段怎么實現,如果不使用CoreData呢?
編寫SQL語句來操作原來表中的字段
- 增加表字段
ALTER TABLE 表名 ADD COLUMN 字段名 字段類型; - 刪除表字段
ALTER TABLE 表名 DROP COLUMN 字段名; - 修改表字段
ALTER TABLE 表名 RENAME COLUMN 舊字段名 TO 新字段名;
九. 簡單描述下客戶端的緩存機制
- 緩存可以分為:內存數據緩存、數據庫緩存、文件緩存
- 每次想獲取數據的時候
- 先檢測內存中有無緩存
- 再檢測本地有無緩存(數據庫\文件)
- 最終發送網絡請求
- 將服務器返回的網絡數據進行緩存(內存、數據庫、文件), 以便下次讀取
十. 利用Socket建立網絡連接的步驟
建立Socket連接至少需要一對套接字,其中一個運行于客戶端,稱為ClientSocket ,另一個運行于服務器端,稱為ServerSocket.
套接字之間的連接過程分為三個步驟:服務器監聽,客戶端請求,連接確認.
- 服務器監聽:服務器端套接字并不定位具體的客戶端套接字,而是處于等待連接的狀態,實時監控網絡狀態,等待客戶端的連接請求。
- 客戶端請求:指客戶端的套接字提出連接請求,要連接的目標是服務器端的套接字。為此,客戶端的套接字必須首先描述它要連接的服務器的套接字,指出服務器端套接字的地址和端口號,然后就向服務器端套接字提出連接請求。
- 連接確認:當服務器端套接字監聽到或者說接收到客戶端套接字的連接請求時,就響應客戶端套接字的請求,建立一個新的線程,把服務器端套接字的描述發給客戶端,一旦客戶端確認了此描述,雙方就正式建立連接。而服務器端套接字繼續處于監聽狀態,繼續接收其他客戶端套接字的連接請求
純手動 有地方是個人理解 有誤的地方希望大家能給指出 謝謝
大家面試中遇到的問題 也可以留言分享
如果您喜歡 或者 對您有點幫助 希望點一下喜歡 謝謝了~~