一.網絡基礎
1.數據解析
1> XML解析方式SAX 方式解析-只讀-速度快-從上向下-通過5個代理方法解析,每個代理方中都需要寫一些代碼?。绻獙崿FSAX解析,思路最重要?。m合比價大的XML的解析DOM解析的特點-一次性將XML全部加載到內存,以樹形結構-好處,可以動態的修改,添加,刪除節點-內存消耗非常大!尤其橫向節點越深?。璱OS默認不支持 DOM 解析?。?MAC 端,或者服務器端開發,都基本上使用 DOM 解析-在 iOS 端如果需要使用 DOM 方式解析,可以使用第三方框GData/KissXML(XMPP)-適合比較小的 XML 文件-在 MAC 中,蘋果提供了一個 NSXML 的類,能夠做 DOM 解析,在 iOS 不能使用!
2>? json&xml的區別
1)解碼難度: json的解碼難度基本為零,xml需要考慮子節點和父節點
2)數據體積&傳輸速度: json相對于xml來講,數據體積小,json的速度遠遠快于xml
3)數據交互: json與JavaScript的交互更加方面,更容易解析處理,更好的數據交互
4)數據描述: xml對數據描述性比較好
2.網絡協議
1>TCP如何防止亂序和丟包? ? TCP數據包的頭格式中有兩個概念,Sequence Number是數據包的序號,用來解決網絡包亂序(reordering)問題。Acknowledgement Number就是ACK——用于確認收到,用來解決不丟包的問題。? ? 位碼即tcp標志位,有6種標示:SYN(synchronous建立聯機)? ? ? ? ACK(acknowledgement 確認) PSH(push傳送) FIN(finish結束) RST(reset重置) URG(urgent緊急)Sequence number(順序號碼) Acknowledge number(確認號碼).? SeqNum的增加是和傳輸的字節數相關的,TCP傳輸數據時,A主機第一次傳輸1440個字節,seq=1,那么第二次時seq = 1441,B拼接數據就是根據seq進行拼接的,seq數字不斷累加避免了亂序.B主機收到第一次數據包以后會返回ack = 1441.? ? A主機收到B的ack = 1441時,就知道第一個數據包B已收到. 如果B沒有收到第一次的數據包,那么B再收到A的數據包時,他就會發ack = 1回去,A收到B的回復,發現B沒有收到第一次數據包,就會重發第一次數據包,這樣就可以防止丟包.
2>描述一下三次握手??
第一次握手:建立連接時,客戶端發送syn包(syn=j)到服務器,并進入SYN_SEND狀態,等待服務器確認;? 第二次握手:服務器收到syn包,必須確認客戶的SYN(ack=j+1),同時自己也發送一個SYN包(syn=k),即SYN+ACK包,此時服務器進入SYN_RECV狀態;? 第三次握手:客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK(ack=k+1),此包發送完畢,客戶端和服務器進入ESTABLISHED狀態,完成三次握手。完成三次握手,客戶端與服務器開始傳送數據.
3> TCP與UDP的區別:
3.1>基于連接與無連接;
3.2>對系統資源的要求(TCP較多,UDP少);
3.3>UDP程序結構較簡單;
3.4>流模式與數據報模式 ;
3.5>TCP保證數據正確性,UDP可能丟包,TCP保證數據順序,UDP不保證。
4>http和scoket通信的區別
http是客戶端用http協議進行請求,發送請求時候需要封裝http請求頭,并綁定請求的數據,服務器一般有web服務器配合(當然也非絕對)。 http請求方式為客戶端主動發起請求,服務器才能給響應,一次請求完畢后則斷開連接,以節省資源。服務器不能主動給客戶端響應(除非采取http長連接技術)。iPhone主要使用類是NSUrlConnection。
scoket是客戶端跟服務器直接使用socket“套接字”進行連接,并沒有規定連接后斷開,所以客戶端和服務器可以保持連接通道,雙方都可以主動發送數據。一般在游戲開發或股票開發這種要求即時性很強并且保持發送數據量比較大的場合使用。主要使用類是CFSocketRef。
5> HTTP請求常用的幾種方式GET :獲取指定資源POST :2M? 向指定資源提交數據進行處理請求,在RESTful 風格用于新增資源HEAD :獲取指定資源頭部信息PUT :替換指定資源(不支持瀏覽器操作)DELETE: 刪除指定資源
3.網絡傳輸
1>DNS是如何工作的DNS是domain name server的簡稱,每個網絡的計算機都有ip,但是不好記,所以用域名替代(如www.baidu.com),在 Internet 上真實在辨識機器的還是 IP,所以當使用者輸入Domain Name 后,瀏覽器必須要先去一臺有 Domain Name 和IP 對應資料的主機去查詢這臺電腦的 IP,而這臺被查詢的主機,我們稱它為 Domain Name Server,簡稱DNS,例如:當你輸入www.pchome.com.tw時,瀏覽器會將www.pchome.com.tw這個名字傳送到離他最近的 DNS Server 去做辨識,如果查到,則會傳回這臺主機的 IP,進而跟它索取資料,但如果沒查到,就會發生類似 DNS NOT FOUND 的情形,所以一旦DNS Server當機,就像是路標完全被毀壞,沒有人知道該把資料送到那里
2> POST請求常見的數據格式?
二.網絡安全/加密
三.數據存儲
1.數據存儲技術?
? 1> 數據存儲的幾種方式 XML屬性列表(plist)歸檔Preference(偏好設置)NSKeyedArchiver歸檔(NSCoding)SQLite3Core Data ?
??2> 各自特點
Plist:屬性列表是一種XML格式的文件,拓展名為plist如果對象是NSString、NSDictionary、NSArray、NSData、NSNumber等類型,就可以使用writeToFile:atomically:方法直接將對象寫到屬性列表文件中? 將一個NSDictionary對象歸檔到一個plist屬性列表中
// 將數據封裝成字典
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
[dict setObject:@"母雞" forKey:@"name"];
// 將字典持久化到Documents/stu.plist文件中
[dict writeToFile:path atomically:YES];?
面試考點:
1.? ? plist的根節點 只能是NSDictionary和NSArray,所以存儲內容必須轉為對象類型
2.? ? 使用場景? 功能動態更新 應用級別數據更新? XML的替代品 偏好設置:每個應用都有個NSUserDefaults實例,通過它來存取偏好設置比如,保存用戶名、字體大小、是否自動登錄
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];[defaults setObject:@"itcast" forKey:@"username"];[defaults setFloat:18.0f forKey:@"text_size"];
[defaults setBool:YES forKey:@"auto_login"];?
面試考點:
1.? ? 使用場景 保存應用信息
2.? ? 特點? 不會自動刪除,itune同步,不適合存大數據
3.? ? 使用單例模式、
4.? ? 直接存取結構體,基本數據類型,無需轉換
5.? ? 即時操作注意同步?
歸檔:如果對象是NSString、NSDictionary、NSArray、NSData、NSNumber等類型,可以直接用NSKeyedArchiver進行歸檔和恢復不是所有的對象都可以直接用這種方法進行歸檔,只有遵守了NSCoding協議的對象才可以NSCoding協議有2個方法:
encodeWithCoder:每次歸檔對象時,都會調用這個方法。
一般在這個方法里面指定如何歸檔對象中的每個實例變量,可以使用encodeObject:forKey:方法歸檔實例變量initWithCoder:每次從文件中恢復(解碼)對象時,都會調用這個方法。一般在這個方法里面指定如何解碼文件中的數據為對象的實例變量,可以使用decodeObject:forKey方法解碼實例變量歸檔一個NSArray對象到Documents/array.archiveNSArray *array = [NSArray arrayWithObjects:@”a”,@”b”,nil];[NSKeyedArchiver archiveRootObject:array toFile:path];? 使用archiveRootObject:toFile:方法可以將一個對象直接寫入到一個文件中,但有時候可能想將多個對象寫入到同一個文件中,那么就要使用NSData來進行歸檔對象? 歸檔(編碼)
// 新建一塊可變數據區NSMutableData *data = [NSMutableData data];
// 將數據區連接到一個NSKeyedArchiver對象NSKeyedArchiver *archiver = [[[NSKeyedArchiver alloc] initForWritingWithMutableData:data] autorelease];
// 開始存檔對象,存檔的數據都會存儲到NSMutableData中[archiver encodeObject:person1 forKey:@"person1"];[archiver encodeObject:person2 forKey:@"person2"];
// 存檔完畢(一定要調用這個方法)[archiver finishEncoding];
// 將存檔的數據寫入文件[data writeToFile:path atomically:YES]; l? ? 恢復(解碼)// 從文件中讀取數據NSData *data = [NSData dataWithContentsOfFile:path];
// 根據數據,解析成一個NSKeyedUnarchiver對象NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];Person *person1 = [unarchiver decodeObjectForKey:@"person1"];Person *person2 = [unarchiver decodeObjectForKey:@"person2"];
// 恢復完畢[unarchiver finishDecoding]; 利用歸檔實現深復制NSData *data = [NSKeyedArchiver archivedDataWithRootObject:person1];
// 解析data,生成一個新的Person對象Student *person2 = [NSKeyedUnarchiver unarchiveObjectWithData:data];? ? ?
? ?面試考點:
1.? ? 特點: 存入Document,itune同步,不會自動刪除,可存放大型用戶數據
2.? ? 使用場景: 用戶產生的數據,如游戲,操作記錄等等
3.? ? 可保存自定義對象,需要遵守NSCoding協議,實現對應的encodeWithCoder? initWithCoder 方法
4.? ? 和NSData的配合4.1> 多對象單目錄存儲4.2> 字典/數組內容的深拷貝5.? ? 不能直接存基本類型和結構體,需要轉成對象? NSValue NSNumber
2> 沙盒目錄結構
2.1> Library Caches Preferences
2.2> Documents2.3> tmp
3>? 如何讀取沙盒中plist的內容1>?
?3.1> 讀取沙盒并拼接plist的文件路徑? ? ? ? ? NSString *path = [[NSBundle mainBundle] pathForResource:@"app.plist" ofType:nil]; 3.2> 根據plist根節點類型讀取plist文件NSArray *apps = [NSArray arrayWithContentsOfFile:path];
2.數據庫技術(SQLite&CoreData)
1> SQLite和CoreData的區別
1.1> CoreData可以在一個對象更新時,其關聯的對象也會隨著更新,相當于你更新一張表時,其關聯的其他表的也回隨著更新
1.2> CoreData提供更簡單的性能管理機制,可以限制查詢記錄的總數,這個類會自動更新其緩存
1.3> 多表查詢方面,CoreData沒有SQL直觀,沒有類似外連接,左連接等操作.
四.Html5/oc&js互調
oc>js:[self.webView stringByEvaluatingJavaScriptFromString:“window.location.href = xxx”];js>oc: 利用hmtl中js的重定向技術,window.location.href = www.baidu.com//method:dosomething使用方法截取重定向(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
五.iOS網絡框架
1> NSURLConnection和NSURLSession的區別
1.1> 異步請求不需要NSOperation包裝
1.2> 支持后臺運行的網絡任務(后臺上傳下載)
1.3> 根據每個Session做配置(http header,Cache,Cookie,protocal,Credential),不再在整個App層面共享配置
1.4> 支持網絡操作的取消和斷點續傳(繼承系統類,重新main方法)
1.5> 改進了授權機制的處理
項目
1.實用技術
2.知名第三方框架
3.開發技巧
1> description方法
Swift
1> Swift和OC的區別
1.1> Swift沒有地址/指針的概念
1.2> 泛型
1.3> 類型嚴謹 對比oc的動態綁定
6.設計模式
1> 常用的設計模式? 代理? 觀察者? 工廠? 單例? 策略
2> 代理屬性的內存策略是什么,為什么?
3> 觀察者模式的使用場景
4> 工廠模式(類方法)為什么沒有釋放對象? autorelease工作原理? arc下還需要手動使用autorelease嗎?為什么?什么場景?
5> 手寫單例
6> 策略? cell多種響應效果? 代理方法
(一)代理模式?
應用場景:當一個類的某些功能需要由別的類來實現,但是又不確定具體會是哪個類實現。?
優勢:解耦合 敏捷原則:開放-封閉原則?
實例:tableview的 數據源delegate,通過和protocol的配合,完成委托訴求。?
列表row個數delegate?
自定義的delegate??
(二)觀察者模式
?應用場景:一般為model層對controller和view進行的通知方式,不關心誰去接收,只負責發布信息。
?優勢:解耦合 敏捷原則:接口隔離原則,開放-封閉原則?
實例:Notification通知中心,注冊通知中心,任何位置可以發送消息,注冊觀察者的對象可以接收。
kvo,鍵值對改變通知的觀察者,平時基本沒用過。?
(三)MVC模式
?應用場景:是一中非常古老的設計模式,通過數據模型,控制器邏輯,視圖展示將應用程序進行邏輯劃分。
?優勢:使系統,層次清晰,職責分明,易于維護 敏捷原則:對擴展開放-對修改封閉
?實例:model-即數據模型,view-視圖展示,controller進行UI展現和數據交互的邏輯控制。?
(四)單例模式?
應用場景:確保程序運行期某個類,只有一份實例,用于進行資源共享控制。?
優勢:使用簡單,延時求值,易于跨模塊
?敏捷原則:單一職責原則
?實例:[UIApplication sharedApplication]。?
注意事項:確保使用者只能通過 getInstance方法才能獲得,單例類的唯一實例。
java,C++中使其沒有公有構造函數,私有化并覆蓋其構造函數。
object c中,重寫allocWithZone方法,保證即使用戶用 alloc方法直接創建單例類的實例,返回的也只是此單例類的唯一靜態變量。?
(五)策略模式
?應用場景:定義算法族,封裝起來,使他們之間可以相互替換。?
優勢:使算法的變化獨立于使用算法的用戶?
敏捷原則:接口隔離原則;多用組合,少用繼承;針對接口編程,而非實現。?
實例:排序算法,NSArray的sortedArrayUsingSelector;經典的鴨子會叫,會飛案例。?
注意事項:
1,剝離類中易于變化的行為,通過組合的方式嵌入抽象基類
2,變化的行為抽象基類為,所有可變變化的父類
3,用戶類的最終實例,通過注入行為實例的方式,設定易變行為 防止了繼承行為方式,導致無關行為污染子類。完成了策略封裝和可替換性。?
(六)工廠模式?
應用場景:工廠方式創建類的實例,多與proxy模式配合,創建可替換代理類。?
優勢:易于替換,面向抽象編程,application只與抽象工廠和易變類的共性抽象類發生調用關系。?
敏捷原則:DIP依賴倒置原則 實例:項目部署環境中依賴多個不同類型的數據庫時,需要使用工廠配合proxy完成易用性替換?
注意事項:項目初期,軟件結構和需求都沒有穩定下來時,不建議使用此模式,因為其劣勢也很明顯, 增 加了代碼的復雜度,增加了調用層次,增加了內存負擔。所以要注意防止模式的濫用。
2> MVVM和rectivecocoa