一. 什么是動(dòng)態(tài)綁定
動(dòng)態(tài)綁定是指在執(zhí)行期間(非編譯期)判斷所引用對(duì)象的實(shí)際類型,根據(jù)其實(shí)際的類型調(diào)用其相應(yīng)的方法.程序運(yùn)行的過程中,把函數(shù)調(diào)用與響應(yīng)調(diào)用所需要的代碼想結(jié)合的過程為動(dòng)態(tài)綁定
二. 什么是協(xié)議?分幾層?
通訊協(xié)議采用了4層的層級(jí)結(jié)構(gòu),每一層都呼叫一下層所提供的網(wǎng)絡(luò)來完成自己的需求.這4層分別為:
- 應(yīng)用層:應(yīng)用程序間溝通的層,如簡(jiǎn)單電子郵件傳輸(SMTP).文件傳輸協(xié)議(FTP).網(wǎng)絡(luò)遠(yuǎn)程訪問協(xié)議(Telnet)等.
- 傳輸層:在此層中,它提供了節(jié)點(diǎn)間的數(shù)據(jù)傳送服務(wù),如傳輸控制協(xié)議(TCP).用戶數(shù)據(jù)協(xié)議(UDP)等.TCP和UDP給數(shù)據(jù)包加入傳輸數(shù)據(jù)并把它傳輸?shù)较乱粚又?這一層負(fù)責(zé)傳送數(shù)據(jù),并且確定數(shù)據(jù)已被傳送
- 互聯(lián)網(wǎng)絡(luò)層: 負(fù)責(zé)提供基本的數(shù)據(jù)封包傳送功能,讓每一塊數(shù)據(jù)包都能夠達(dá)到目的主機(jī)(但不檢查是否被正確傳送),如網(wǎng)絡(luò)協(xié)議(IP).
- 網(wǎng)絡(luò)接口層:對(duì)實(shí)際的網(wǎng)絡(luò)媒體管理.定義如何使用實(shí)際網(wǎng)絡(luò)(如Ethernet Serial Line等)來傳送數(shù)據(jù)
三. TCP和UDP的區(qū)別?這兩包的字節(jié)內(nèi)容有啥不同?
TCP(Transmission Control Protocol沙廉,傳輸控制協(xié)議)
TCP是基于鏈接的協(xié)議,也就是說,在正是收發(fā)數(shù)據(jù)前,必須和對(duì)方建立可靠的鏈接.一個(gè)TCP鏈接必須要經(jīng)過三次"對(duì)話"才能建立起來,其中的過程非常復(fù)雜,簡(jiǎn)單介紹:主機(jī)A向主機(jī)B發(fā)出鏈接請(qǐng)求數(shù)據(jù)包"我給你發(fā)數(shù)據(jù),可以嗎?"這是第一次對(duì)話;主機(jī)B??主機(jī)A發(fā)送同意鏈接和要求同步(同步就是兩臺(tái)主機(jī)一個(gè)在發(fā)送,一個(gè)在介紹,協(xié)調(diào)工作)的數(shù)據(jù)包:"可以",這是第二次對(duì)話;主機(jī)A再發(fā)出一個(gè)數(shù)據(jù)包確認(rèn)主機(jī)B的要求同步;"我發(fā)的 你接著",這是第三次對(duì)話. 三次對(duì)話的目的是使數(shù)據(jù)包發(fā)送和接受同步,經(jīng)過三次對(duì)話后,主機(jī)才向主機(jī)B正是發(fā)送數(shù)據(jù).
UDP(User Data Protocol母怜,用戶數(shù)據(jù)報(bào)協(xié)議)
UDP是與TCP相對(duì)應(yīng)的協(xié)議.它是面向非連接的協(xié)議,它不與對(duì)方建立連接,而是直接就把數(shù)據(jù)包發(fā)送過去!
UDP適合用于一次只傳送少量的數(shù)據(jù),對(duì)可靠性要求不高的應(yīng)用環(huán)境,比如,我們經(jīng)常使用"ping"命令來測(cè)試兩臺(tái)主機(jī)之間TCP/IP通信是否正常.其實(shí)"ping"命令的原理就想對(duì)方主機(jī)發(fā)送UDP數(shù)據(jù)包脱篙,然后對(duì)方主機(jī)確認(rèn)收到數(shù)據(jù)包馏艾,如果數(shù)據(jù)包是否到達(dá)的消息及時(shí)反饋回來,那么網(wǎng)絡(luò)就是通的做入。正因?yàn)閁DP協(xié)議沒有連接的過程喂很,所以它的通信效果高;但也正因?yàn)槿绱颂疲目煽啃圆蝗鏣CP協(xié)議高械巡。QQ就使用UDP發(fā)消息,因此有時(shí)會(huì)出現(xiàn)收不到消息的情況饶氏。
四. 你是否接觸過OC中的反射機(jī)制?
NSObject常用的方法:
判斷一個(gè)類是否屬于某個(gè)類或者是它的子類
- (BOOL)isKindOfClass:(Class)aClass;
判斷一個(gè)類對(duì)象是否為一個(gè)類的實(shí)例(不包括子類)
- (BOOL)isMemberOfClass:(Class)aClass
Class的反射
- 根據(jù)字符串創(chuàng)建一個(gè)類
Class class = NSClassFromString(@“Student”)
Student *st= [class alloc]init] - 將類名改為字符串
Class class = [Student class];
NSString *str = NSStringFromClass(class);
SEL的反射
通過方法的字符串形式實(shí)例化方法
SEL sel = NSSelectorFromString(@“setName:”);
[st performSelector:sel withObject:@“Mike”];
將方法變成字符串
NSStringFromSelector(@selector(setName:));
五.C和Obj-c如何混用
- obj-c的編譯器處理后綴為m的文件時(shí)讥耗,可以識(shí)別obj-c和c的代碼, 處理mm文件可以識(shí)別obj-c,c,c++代碼疹启,但cpp文件必須只能用c/c++代碼古程,而且cpp文件include的頭文件中,也不能出現(xiàn)obj- c的代碼喊崖,因?yàn)閏pp只是cpp
- 在mm文件中混用cpp直接使用即可挣磨,所以obj-c混cpp不是問題
- 在cpp中混用obj- c其實(shí)就是使用obj-c編寫的模塊是我們想要的。
如果模塊以類實(shí)現(xiàn)荤懂,那么要按照cpp class的標(biāo)準(zhǔn)寫類的定義茁裙,頭文件中不能出現(xiàn)obj-c的東西,包括#import cocoa的节仿。實(shí)現(xiàn)文件中晤锥,即類的實(shí)現(xiàn)代碼中可以使用obj-c的東西,可以import,只是后綴是mm。
如果模塊以函數(shù)實(shí)現(xiàn)矾瘾,那么頭文件要按 c的格式聲明函數(shù)女轿,實(shí)現(xiàn)文件中,c++函數(shù)內(nèi)部可以用obj-c壕翩,但后綴還是mm或m蛉迹。
總結(jié):只要cpp文件和cpp include的文件中不包含obj-c的東西就可以用了,cpp混用obj-c的關(guān)鍵是使用接口放妈,而不能直接使用實(shí)現(xiàn)代碼北救,實(shí)際上cpp混用的是 obj-c編譯后的o文件,這個(gè)東西其實(shí)是無差別的芜抒,所以可以用珍策。obj-c的編譯器支持cpp.
六. 談?wù)剅untime機(jī)制
- runtime,運(yùn)行時(shí)機(jī)制,它是一套C語言庫
- 實(shí)際上我們編寫的所有OC代碼挽绩,最終都是轉(zhuǎn)成了runtime庫的東西,比如類轉(zhuǎn)成了runtime庫里面的結(jié)構(gòu)體等數(shù)據(jù)類型驾中,方法轉(zhuǎn)成了runtime庫里面的C語言函數(shù)唉堪,平時(shí)調(diào)方法都是轉(zhuǎn)成了objc_msgSend函數(shù)(所以說OC有個(gè)消息發(fā)送機(jī)制)
- 因此,可以說runtime是OC的底層實(shí)現(xiàn)肩民,是OC的幕后執(zhí)行者
- 有了runtime庫唠亚,能做什么事情呢?runtime庫里面包含了跟類持痰、成員變量灶搜、方法相關(guān)的API,比如獲取類里面的所有成員變量工窍,為類動(dòng)態(tài)添加成員變量割卖,動(dòng)態(tài)改變類的方法實(shí)現(xiàn),為類動(dòng)態(tài)添加新的方法等
- KVO是runtime的一個(gè)典型應(yīng)用
七. AFN 與 ASI 有什么區(qū)別
- AFN基于NSURL患雏,ASI基于底層的CFNetwork框架鹏溯,因此ASI的性能優(yōu)于AFN
- AFN采取block的方式處理請(qǐng)求,ASI最初采取delegate的方式處理請(qǐng)求淹仑,后面也增加了block的方式
- AFN只封裝了一些常用功能丙挽,滿足基本需求,直接忽略了很多擴(kuò)展功能匀借,比如沒有封裝同步請(qǐng)求颜阐;ASI提供的功能較多,預(yù)留了各種接口和工具供開發(fā)者自行擴(kuò)展
- AFN直接解析服務(wù)器返回的JSON吓肋、XML等數(shù)據(jù)凳怨,而ASI比較原始,返回的是NSData二進(jìn)制數(shù)據(jù)
八. 如果后期需要增加數(shù)據(jù)庫中的字段怎么實(shí)現(xiàn)是鬼,如果不使用CoreData呢猿棉?
編寫SQL語句來操作原來表中的字段
- 增加表字段
ALTER TABLE 表名 ADD COLUMN 字段名 字段類型; - 刪除表字段
ALTER TABLE 表名 DROP COLUMN 字段名; - 修改表字段
ALTER TABLE 表名 RENAME COLUMN 舊字段名 TO 新字段名;
九. 簡(jiǎn)單描述下客戶端的緩存機(jī)制
- 緩存可以分為:內(nèi)存數(shù)據(jù)緩存磅叛、數(shù)據(jù)庫緩存、文件緩存
- 每次想獲取數(shù)據(jù)的時(shí)候
- 先檢測(cè)內(nèi)存中有無緩存
- 再檢測(cè)本地有無緩存(數(shù)據(jù)庫\文件)
- 最終發(fā)送網(wǎng)絡(luò)請(qǐng)求
- 將服務(wù)器返回的網(wǎng)絡(luò)數(shù)據(jù)進(jìn)行緩存(內(nèi)存萨赁、數(shù)據(jù)庫弊琴、文件), 以便下次讀取
十. 利用Socket建立網(wǎng)絡(luò)連接的步驟
建立Socket連接至少需要一對(duì)套接字杖爽,其中一個(gè)運(yùn)行于客戶端敲董,稱為ClientSocket ,另一個(gè)運(yùn)行于服務(wù)器端慰安,稱為ServerSocket.
套接字之間的連接過程分為三個(gè)步驟:服務(wù)器監(jiān)聽腋寨,客戶端請(qǐng)求,連接確認(rèn).
- 服務(wù)器監(jiān)聽:服務(wù)器端套接字并不定位具體的客戶端套接字化焕,而是處于等待連接的狀態(tài)萄窜,實(shí)時(shí)監(jiān)控網(wǎng)絡(luò)狀態(tài),等待客戶端的連接請(qǐng)求撒桨。
- 客戶端請(qǐng)求:指客戶端的套接字提出連接請(qǐng)求查刻,要連接的目標(biāo)是服務(wù)器端的套接字。為此凤类,客戶端的套接字必須首先描述它要連接的服務(wù)器的套接字穗泵,指出服務(wù)器端套接字的地址和端口號(hào),然后就向服務(wù)器端套接字提出連接請(qǐng)求谜疤。
- 連接確認(rèn):當(dāng)服務(wù)器端套接字監(jiān)聽到或者說接收到客戶端套接字的連接請(qǐng)求時(shí)佃延,就響應(yīng)客戶端套接字的請(qǐng)求,建立一個(gè)新的線程夷磕,把服務(wù)器端套接字的描述發(fā)給客戶端履肃,一旦客戶端確認(rèn)了此描述,雙方就正式建立連接坐桩。而服務(wù)器端套接字繼續(xù)處于監(jiān)聽狀態(tài)榆浓,繼續(xù)接收其他客戶端套接字的連接請(qǐng)求
純手動(dòng) 有地方是個(gè)人理解 有誤的地方希望大家能給指出 謝謝
大家面試中遇到的問題 也可以留言分享
如果您喜歡 或者 對(duì)您有點(diǎn)幫助 希望點(diǎn)一下喜歡 謝謝了~~