![](http://static.javashuo.com/static/loading.gif)
「Tim的博客」iOS基礎問答面試題連載(一)-附答案html
「Tim的博客」iOS基礎問答面試題連載(二)-附答案ios
「Tim的博客」iOS基礎問答面試題連載(三)-附答案git
「Tim的博客」iOS基礎問答面試題連載(四)github
此次的問題是網絡多線程相關的喲,面試的時候也是必問的,你們多看看面試
11月24日修正一處錯誤:1八、19題目同樣,答案不同(實際上是兩種理解,修改成最優的一種放上來.多謝讀者提醒)算法
如下是一些本身收集的網絡多線程方面比較基礎的問題(大神能夠忽略),附上答案,方便你們閱讀。俗話說得好,基礎不牢,地動山搖。文章末尾會提供PDF版的文檔,方便你們木有網的時候也能夠用移動設備觀看。編程
1.請簡單說明多線程技術的優勢和缺點?
- 可以適當提升程序的執行效率;
- 可以適當的提升資源的利用率,好比CPU、內存。
- 建立線程有額外開銷
- 程序的代碼更加複雜
- 線程越多,CPU在調度線程上的開銷就越大
- 若是開啓大量線程,反而會下降程序的性能
2.請簡單說明線程和進程,以及他們之間的關係?
- 進程是CPU調度和分配資源的單位。
- 線程是CPU調用的最小單位
- 進程包含線程;
- 一個程序能夠對應多個進程,一個進程中能夠有多個線程,但至少要有一個線程;
- 同一個進程內的線程共享進程的資源。
3.請簡單說明在iOS開發中有哪些多線程的實現方案?
- PThread
- NSThread
- GCD
- NSOperation
4.請簡單說明主線程的做用,以及使用注意點?
- 主線程:默認啓動的線程
- 做用:(1)顯示和刷新UI界面 (2)處理UI事件
- 注意點:
- 不要將耗時操做放在主線程中執行
- UI操做必須在主線程中執行 !!!!
5.請簡單列出NSThread線程的幾種狀態,並說明狀態轉換的邏輯?
新建->就緒 CPU調度當前任務->運行->阻塞->死亡
CPU調度其餘任務->就緒
6.請簡單說明如何簡單的解決多線程訪問同一塊資源形成的線程安全的問題,以及注意點?
- 加同步(互斥)鎖,
- @synchronized
- OC中的同步鎖:(鎖對象) + {要鎖住的代碼}
- 鎖對象:要求是全局惟一的屬性
- 注意點:
- 要注意加鎖的位置
- 加鎖須要耗費性能,所以須要注意加鎖的條件(多線程訪問同一塊資源)
- 專業術語:線程同步
7.請簡單介紹下什麼是原子和非原子屬性?
- atomic:原子屬性,會爲setter方法加鎖,默認爲atomic。線程安全,會消耗大量資源
- nonatomic:非原子屬性,不會爲setter方法加鎖。非線程安全,適合內存小的移動設備。
8.請簡單介紹下GCD這門技術?
- 全稱 Grand Central Dispatch,中樞調度器。
- GCD中有2個核心概念:任務和隊列。
- GCD使用:封裝任務,將封裝好的任務添加到隊列中,遵循FIFO。
9.請簡單介紹GCD中的幾種隊列?(4種)
- 併發隊列:多個任務同時執行,會開啓多個線程同時執行任務,只有在異步函數下才有效。
- 串行隊列:任務只能一個接一個的去執行,不會開啓多個線程,主隊列屬於串行隊列,主隊列全部的任務必須在主線程中執行。
- 全局隊列
- 主隊列
10.若是當前有多個任務,這些任務都須要開子線程執行,而多個任務之間有必定的依賴關係,若是使用GCD來實現請試着給出一些解決方案。
11.請簡單說明單例模式的特色(做用)?
- 若是一個類實現了單例,那麼能夠保證在程序運行過程,一個類只有一個實例
- 單例對象易於供外界訪問(一般會提供一個類方法)
- 實現了單例模式後,能夠方便地控制了實例個數,並節約系統資源
12.請簡單介紹操做隊列?
- 操做隊列自己是OC語言的,在iOS開發中能夠用來實現多線程編程
- 操做隊列有兩大核心的概念,一個是操做(NSOperation),一個是隊列(NSOperationQueue),操做用來封裝任務,隊列用來存放操做
- 要使用操做隊列進行多線程編程,只須要把封裝好的操做提交到相應的隊列中便可,系統內部會視狀況自動開啓相應的線程來執行任務
- 在操做隊列這門技術中,系統提供了兩個子類能夠來封裝任務,一個是NSInvocationOperation,一個是NSBlockOperation,除此以外也能夠直接自定義操做
- 操做隊列中有兩種隊列,一種是經過[NSOperationQueue mainQueue]得到的主隊列,一種是經過[[NSOperationQueue alloc]init]方法得到的非主隊列
- 主隊列是和主線程相關的串行隊列,提交到主隊列中的操做將被安排在主線程中執行(能夠利用該特性來處理線程間通訊的相關邏輯)
- 操做+隊列:
- NSInvocationOperation
- NSBlockOperatio
- NSOperationQueue
- 本身建立 [[NSOperationQueue alloc]init];
- 主隊列 [NSOperationQueue main];
13.若是有多個操做如何來設置依賴關係,如何監聽到某個操做執行完畢事件?
- 設置依賴關係:假設有有兩個操做分別是op1和op2,op1須要依賴於op2,那麼只須要使用[op1 addDependency:op2]方法設置便可。
- 操做依賴補充:使用操做隊列能夠方便的指定多個操做間的依賴關係,甚至能夠實現跨隊列的操做依賴,可是在使用的時候須要注意操做之間不能有循環依賴關係
- 操做監聽:可使用^completionBlock來實現操做監聽
14.請簡單比較GCD中的全局併發隊列和使用dispatch_queue_create函數建立的併發隊列異同?
- 全局併發隊列在整個應用程序中自己是默認存在的而且對應有高優先級、默認優先級、低優先級和後臺優先級一共四個併發隊列,咱們只是選擇其中的一個直接拿來用。而Create函數是實打實的從頭開始去建立一個隊列。
- 在iOS6.0以前,在GCD中凡是使用了帶Create和retain的函數在最後都須要作一次release操做。而主隊列和全局併發隊列不須要咱們手動release。固然了,在iOS6.0以後GCD已經被歸入到了ARC的內存管理範疇中,即使是使用retain或者create函數建立的對象也再也不須要開發人員手動釋放,咱們像對待普通OC對象同樣對待GCD就OK。
- 在使用柵欄函數的時候,柵欄函數只有在和使用create函數本身的建立的併發隊列一塊兒使用的時候纔有效
- 其它區別涉及到XNU內核的系統級線程編程,不一一列舉。
15.請簡單說明對圖片進行二級緩存的實現思路?
1.先檢查該圖片對應的內存緩存json
1.若是存在內存緩存,則數組
a.直接使用設置並顯示圖片;瀏覽器
2.若是內存緩存中沒有,則
a.繼續檢查該圖片對應的磁盤緩存是否存在,跳轉到第2步。
2.檢查該圖片對應的磁盤緩存
1.若是存在磁盤緩存,則
a.先保存一份到內存緩存中(方便下次使用)
b.而後設置並顯示圖片
2.若是不存在磁盤緩存,則直接下載該圖片,下載完成後
a.保存一份到內存緩存中
b.保存一份到磁盤緩存中
c.設置並顯示圖片
16.請簡單對比下GCD和NSOperation兩種多線程的實現方案?
- GCD是純C語言的API,而操做隊列則是Object-C的對象。
- 在GCD中,任務用塊(block)來表示,而塊是個輕量級的數據結構;相反操做隊列中的『操做』NSOperation則是個更加劇量級的Object-C對象。
- 具體該使用GCD仍是使用NSOperation須要看具體的狀況,若是隻是想簡單開一個子線程執行任務推薦使用GCD,若是有不少任務須要開多個子線程下載推薦使用操做隊列
17.請按照本身的理解,說一說在進行多線程編程的時候相對於GCD而言,操做隊列有哪些優點?
- NSOperation和NSOperationQueue的好處有:
- NSOperationQueue能夠方便的調用cancel方法來取消某個操做,而GCD中的任務是沒法被取消的(安排好任務以後就無論了)。
- NSOperation能夠方便的指定操做間的依賴關係。
- NSOperation能夠經過KVO提供對NSOperation對象的精細控制(如監聽當前操做是否被取消或是否已經完成等)
- NSOperation能夠方便的指定操做優先級。操做優先級表示此操做與隊列中其它操做之間的優先關係,優先級高的操做先執行,優先級低的後執行。
- 經過自定義NSOperation的子類能夠實現操做重用
18.請談一談,自定義操做的好處?
- 自定義操做,對操做進行封裝,那麼之後在使用的時候只須要alloc init便可,建立該操做的人不須要關係內部的代碼實現,信息隱蔽。
- 自定義操做有助於代碼重用
19.請簡單介紹GCD中的一次性代碼?
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSLog(@"-------");
});
在整個程序運行過程當中block中的代碼只會被執行一次
一次性代碼自己是線程安全的
20.GCD中的dispatch_after是延遲把任務提交到隊列仍是先提交到隊列再延遲執行?
- 是延遲以後在把任務提交到隊列執行,把任務提交到隊列中在延遲執行難度較大,不容易實現.
21.請說明NSRunloop和線程的關係?
- 線程和runloop是一一對應的關係(字典)
- 主線程對應的runloop是默認建立並啓動的
- 子線程對應的runloop須要手動的建立並啓動
- 如何得到子線程對應的runloop?[NSRunloop currentRunloop]該方法是懶加載的,在第一次調用該方法的時候發現該子線程對應的runloop不存在則會直接建立一個runloop保存而且返回.
- 線程銷燬後runloop也要銷燬
22.請簡單說明NSCache的特色
- NSCache是蘋果推出專門用來處理內存緩存的類
- NSCache默認是線程安全的,在使用的時候能夠不用考慮線程安全的問題
- NSCache使用方法和可變字典相似,當緩存文件超過最大限度的時候會開啓一個回收過程,把最老的緩存對象回收
- NSCache能夠設置緩存的const(成本)和緩存的數量
23.請簡單說明runloop中幾個類之間的相互關係(runloop & source & timer &observer &mode)
- runloop啓動以後會選擇一種運行模式,在執行執行會先檢查運行模式內部是否有source和timers,若是一個sourc或者是一個timer都沒有那麼runlooop啓動以後就馬上退出了。
- runlooop的source有兩種分類方法,按照之前的分類方法能夠分爲
- 基於端口的
- 自定義的
- performSelector事件
- 按照函數調用棧來劃分,能夠分爲source0和soucr1。
- observer,能夠用來監聽當前runloop運行狀態的改變,注意(Core foundation框架)
- NSTimer必須添加到runloop中才會工做,且其工做收到runloop運行模式的影響。
24.請簡單介紹下SDWebImage框架?
- SDWebImage框架是一款很是流行的用來處理圖片下載和緩存的第三方框架
- SDWebImage框架爲咱們提供了高性能異步下載圖片的方案,內部使用GCD等多線程相關技術
- 使用SDWebImage框架來下載圖片,它內部默認會對圖片進行內存緩存和磁盤緩存的二級緩存結構
- 該框架爲UIButton,UIImageView等UI控件提供了分類,可以方便的處理相關控件圖片的遠程下載和緩存設置
- 該框架內部還提供了GIF圖片播放,判斷圖片類型等通常功能
25.請問SDWebImage框架內部在清理磁盤緩存的時候clearDisk方法和cleanDisk方法有什麼區別?
- clearDisk:直接把整個緩存文件刪除,刪除以後建立一個新的空文件;
- cleanDisk:先刪除過時的緩存文件,而後計算當前剩餘緩存文件的大小,若是該數值超過設定的最大緩存大小,那麼久安全文件建立的時間從遠到近依次刪除,直到整個剩餘緩存文件大小小於設定的最大緩存大小爲止。
26.請問SDWebImage框架的框架結構是怎麼樣的?
- SDWebImage框架有幾個主要的組件:
- 管理者(SDWebImageManager)
- 緩存處理組件(SDImageCache)主要對下載的圖片進行內存緩存和磁盤緩存處理
- 下載處理組件(SDWebImageDownloader|SDWebImageDownloadOperation)主要處理開子線程異步發送網絡請求下載圖片相關操做
27.請問SDWebImage框架內部怎麼處理內存緩存的?
28.請簡單說明NSRunloop的基本做用?
- 保持程序的持續運行
- 處理App中的各類事件(好比觸摸事件、定時器事件、Selector事件)
- 節省CPU資源,提升程序性能:該作事時作事,該休息時休息
29.什麼是runloop?
- 從字面意思看:運行循環、跑圈.其實它內部就是do-while循環,在這個循環內部不斷地處理各類任務(好比Source、Timer、Observer)
- 一個線程對應一個RunLoop,主線程的RunLoop默認已經啓動,子線程的RunLoop得手動啓動(調用run方法)
- RunLoop只能選擇一個Mode啓動,若是當前Mode中沒
何Source(Sources0、Sources1)、Timer,那麼就直接退出RunLoop
30.runloop的自動釋放池何時建立釋放?
- 當runloop進入的時候會建立一個自動釋放池。
- 當runloop退出的時候會把以前的自動釋放池銷燬。
- 當runloop即將進入休眠的時候會把以前的自動釋放池先銷燬,而後建立一個新的自動釋放池。
31.請簡單說明使用NSURLConnection發送網絡請求的幾種方法?
- 使用NSURLConnection發送同步請求([NSURLConnection sendSync....])
- 使用NSURLConnection發送異步請求1([NSURLConnection sendAsync...])
- 使用NSURLConnection發送異步請求2(設置代理,再發送網絡請求)
同步 NSData *data = [NSURLConnection sendSync....]
異步 [NSURLConnection sendAsync]
代理 delegate
32.請簡單說明GET請求和POST個請求有什麼區別,如何選擇?
- GET請求的參數直接用&拼接並以?爲分隔拼接在請求URL的後面
- POST請求的參數是轉換爲二進制設置在請求體傳遞的
- 若是僅僅只是索取數據得到數據,那麼建議使用GET請求,其餘狀況則建議使用POST請求,相對而言POST請求安全性更好一些。
33.請簡單列出使用NSURLConnection發送一個異步POST網絡請求的步驟?
- 肯定請求路徑(URL)
- 建立可變的請求對象(NSMutableURLRequest)
- 修改請求方法爲POST請求
- 把參數拼接起來轉換爲二進制數據,設置請求體
- 使用NSURLConnection發送異步請求`([NSURLConnection sendAsync....])`
- 解析服務器返回的數據,查看請求結果
34.請簡單說明HTTP通訊的過程?
- 請求:若是客戶端想要得到相應的數據,那麼就對着服務器發送一個請求,請求是客戶端向服務器索要數據的過程。
- 響應:服務器接收到客戶端的請求以後,須要對該請求做出反應,響應是服務器端把數據返回給客戶端的過程。
- 請求分爲兩部分,一個是請求頭,一個是請求體(GET請求沒有請求體)。其中請求頭是對客戶端信息和請求自己的描述,而請求體存放要發送給服務器端的具體數據
- 響應分爲兩部分,一個是響應頭,一個是響應體。其中響應頭是對服務器端信息和響應數據自己的描述,而響應體存放要發送給客戶端的具體數據。
35.請簡單說明NSURLSession對比NSURLConnection的優點?
- session支持http2.0協議(iOS 9.0 +)
- 在處理下載任務的時候能夠直接把數據下載到磁盤
- 支持後臺下載|上傳
- 同一個session發送多個請求,只須要創建一次鏈接(複用了TCP)
- 提供了全局的session而且能夠統一配置,使用更加方便
- 下載的時候是多線程異步處理的效率更高
36.請簡單列出NSURLSession發送POST請求的步驟?
- 肯定請求路徑(NSURL)
- 建立可變的請求對象(NSMutableURLRequest)
- 修改請求方法爲POST(HTTPMethod)
- 把要傳遞的參數拼接,轉換爲二進制數據,設置爲請求體(HTTPBody)
- 建立會話對象(NSURLSession shareSession)
- 根據會話對象來建立一個NSURLSessionDataTask任務
- 執行請求Task (須要調用Resume方法)
- 拿到服務器返回的數據以後,解析數據
37.在發送網絡請求的時候,若是請求路徑中的參數有中文致使發送的網絡請求失敗,應該如何處理?
- 若是URL字符串中有中文,那麼在進行使用發送請求的時候應該先對URL進行中文轉碼
- 相關方法:
[urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]
38.觀察下面的代碼,請問completionHandler在主線程仍是子線程執行?
[[session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
//....
}] resume];
- completionHandler在子線程中執行。
39.請簡單介紹下網絡響應的狀態碼?
- 狀態碼的職責是當客戶端向服務器端發送請求時,描述返回的請求結果。藉助狀態碼,用戶能夠知道服務器端是正常處理了請求仍是出現了錯誤。
- 如200 OK狀態碼以3位數字+緣由短語組成。數字中的第一位指定了響應的類別, 後兩位無分類。
- 狀態碼分爲五種類別,分別是:
- 以1開頭的(如100),定義範圍爲100~101,表示接收的請求正在處理,緣由短語爲Informational(信息性狀 態碼)。
- 以2開頭的(如200),定義範圍爲200~206,表示請求正常處理完畢,緣由短語爲Success(成功狀態碼)。
- 以3開頭的(如300),定義範圍爲300~305,表示須要進行附加的操做以完成網絡請求,緣由短語爲Redirection(重定向狀態 碼)。
- 以4開頭的(如404),定義範圍爲400~415,表示客戶端有錯誤,服務器沒法處理請求,緣由短語爲Client error(客戶端錯誤)。
- 以5開頭的(如500),定義範圍爲500~505,表示服務器端處理請求出錯,緣由短語爲Server error(服務器錯誤)。
40.使用NSURLSession發送網絡請求的時候,最多能夠創建多少個TCP鏈接?
- 在iOS中最多能夠創建4個鏈接,在OSX中默認最多能夠創建6個鏈接。
- 在iOS中NSURLSessionConguration內部有`HTTPMaximumConnectionsPerHost`屬性,能夠設置鏈接的數 量:The default value is 6 in OS X, or 4 in iOS
- 說明:
- 因爲HTTP/1.1 不支持多路複用,所以若是要處理多個網絡請求,在處理HTTP請求的時候 多數瀏覽器廠商都是不假思索的就在客戶端排隊全部的HTTP請求,而後經過一個持久鏈接,一個接着一個的發送這些請求。然而這種方式性能實在太差。實際上,瀏覽器開發商對於對於此性能問題,尚沒有任何更好的辦法,所以只能容許客戶端並行打開多個TCP鏈接會話。可是具體最多能夠打開多少個TCP鏈接是有數量限制的, 多數現代的瀏覽器,包括桌面和移動瀏覽器,都支持打開6個鏈接。即客戶端能夠並行分派最多6個請求,服務器能夠並行處理最多6個請求。
- 爲何是6個鏈接?有什麼特殊的意義嗎?其實,這個數字是多方平衡後的結果:這個數字越大,便可以帶來更多的請求並行能力,可是一樣的客戶端和服務器端所佔用的資源也會越多。所以,每一個主機6個鏈接只不過是你們都以爲比較安全,可以接受的一個數字而已。
41.請簡單介紹JSON和XML?
- JSON和XML都是一種用來表示數據的一種數據格式,JSON更加輕量級。
- 服務器返回的數據一般是JSON的或者是XML的兩種,JSON數據格式和OC對象中字典和數組有些類似,XML又稱爲XML文檔,XML的語法結構由三部分構成分別是文檔聲明,元素和屬性。
- 若是服務器返回的數據是JSON,那麼在開發中一般須要對JSON數據進行反序列化處理,把JSON數據轉換爲OC對象。
- 若是服務器返回的數據是XML格式的,那麼須要對XML文檔進行解析,解析XML的方式有兩種,分別是SAX(從根元素開始解析)和DOM(先把整個XML文檔加載進內存再解析)
42.JSON格式中的true和false,對應OC中的什麼數據類型,值爲多少?
- true和false對應OC中的NSNumber數據類型
- true對應的值爲1,false對應的值爲0
43.請簡單說明什麼是序列化和反序列處理,用到了什麼方法?
- 反序列化處理,即把JSON數據--->OC對象,使用的方法爲:`[NSJSONSerialization JSONObjectWithData:jsonData options:kNilOptions error:nil]`
- 序列化處理,即把OC對象--->JSON數據,使用的方法爲:`[NSJSONSerialization dataWithJSONObject:jsonString options:0 error:nil]`,注意並非全部的OC對象都可以序列化爲JSON數據
44.請簡單說明輸出流的使用步驟【應用於文件下載時】和注意點?
使用步驟:
- 建立輸出流(指定路徑)
- 打開輸出流(open)
- 使用輸出流寫數據 (write...)
- 關閉輸出流 (close)
45.請簡單說明文件句柄(NSFileHandle)的使用步驟【應用於文件下載時】和注意點?
使用步驟:
- 建立空的文件(路徑)
- 建立文件句柄(指向文件) 默認指向開頭
- 使用文件句柄來寫數據(內部邊寫數據邊移動文件句柄指針)
- 關閉文件句柄(closeFile)
- 在寫使用文件句柄指針寫數據的時候,內部會自動移動文件句柄指針
- 寫數據的時候能夠設置位置(偏移量),如設置從文件的末尾接着寫數據
- 使用完畢以後,應該把句柄關閉
46.請簡單介紹下NSURLSessionTask的幾個子類?
- NSURLSessionTask是一個抽象類,若是要使用那麼只能使用它的子類;
- NSURLSessionTask有兩個子類,一個是NSURLSessionDataTask,該task能夠用來處理通常的網絡請求,如GET|POST請求等,一個是NSURLSessionDownloadTask,該downloadTask在處理下載請求的時候有很大的優點;
- NSURLSessionDataTask有一個子類爲NSURLSessionUploadTask,該uploadTask在處理上傳請求的時候有優點.
47.請簡單介紹在iOS開發中XML的幾種解析方式?
- XML文檔有兩種解析模式,一種是SAX(從根元素開發一個接着一個的解析),一種是DOM(將整個XML文檔加載進內存解析)
- 在iOS開發中經常使用的XML的解析方法有兩種,一種是使用蘋果原生的NSXMLParser來解析(該方法基於SAX),一種是使用谷歌公司提供的第三方框架GDataXML來解析(該方法基於DOM)
DOM 一次性加載 GDataXML
SAX 一個元素一個元素的解析 NSXMLParser(建立解析器->設置代理->開始解析)
48.如何解決session設置代理以後對代理對象的強引用問題?
- NSURLSession對象在使用的時候,若是設置了代理,那麼session對代理對象會保持一個強引用,在合適的時候應該主動進行釋放
- 能夠在控制器調用viewDidDisappear方法的時候來進行處理,能夠經過調用invalidateAndCancel方法或者是finishTasksAndInvalidate方法來釋放對代理對象的強引用
- invalidateAndCancel方法直接取消請求而後釋放代理對象,finishTasksAndInvalidate方法等請求完成以後釋放代理對象。
49.在XCode中如何配置以MRC的方式來編譯處理某個類?
- 點擊項目的Targets,點擊Build phases(編譯階段),點擊展開Compile Sources,找到要處理的類,配置爲-fno-objc-arc便可。
50.在使用NSURLSessionDataTask發送請求下載文件的時候,實現斷點下載的技術要點是什麼?
- 所謂斷點下載,即只下載完整文件中的某一部分數據,如該文件有10M,那麼須要作到只請求下載這個文件中5M~10M的這部分數據
- 能夠經過設置請求頭信息來實現,參考代碼以下:
NSString *header = [NSString stringWithFormat:@"bytes=%zd-",self.currentSize];
[request setValue:header forHTTPHeaderField:@"Range"]
51.請簡單比較使用NSURLSessionDownloadTask下載文件和使用NSURLSessionDataTask下載文件的優劣?
- NSURLSessionDataTask下載文件的優勢:能夠實現離線斷點下載。缺點:代碼複雜
- NSURLSessionDownloadTask下載文件的
- 優勢:
- 內部已經完成了邊接收數據邊寫入到沙盒中的操做(解決了下載大文件時候的內存飆升問題)
- 能夠方便的實現斷點下載
- 缺點:
52.請列出使用NSURLSession發送請求實現文件上傳的主要步驟?
- 肯定上傳請求的路徑 (NSURL)
- 建立可變的請求對象(NSMutableURLRequest)
- 修改請求方法爲POST
- 設置請求頭信息(告知服務器端這是一個文件上傳請求)
- 按照固定的格式拼接要上傳的文件等參數
- 根據請求對象建立會話對象(NSURLSession對象)
- 根據session對象來建立一個uploadTask上傳請求任務
- 執行該上傳請求任務(調用resume方法)
- 獲得服務器返回的數據,解析數據(上傳成功|上傳失敗)
53.請列出你認爲在進行文件上傳時候須要注意的細節(注意點)?
- 建立可變的請求對象,由於須要修改請求方法爲POST,設置請求頭信息
- 設置請求頭這個步驟可能會被遺漏
- 要處理上傳參數的時候,必定要按照固定的格式來進行拼接
- 須要採用合適的方法來得到上傳文件的二進制數據類型(MIMEType)
54.請簡單說明可以得到文件二進制數據類型(MIMEType)的幾種方法?
- 直接百度 搜索
- 對着該文件發送一個網絡請求,接受到該請求響應的時候,能夠經過響應頭信息中的MIMEType屬性獲得
- 使用通用的二進制數據類型表示任意的二進制數據 application/octet-stream
- 調用C語言的API來實現
55.請簡單介紹下AFN各個主要版本的狀況?
0.1--1.0 "2.0---2.6.3" 3.0-->3.1.0
NSURLConnection - (NSURLConnection + NSURLSession) - NSURLSessio
0.1-2.0 NSURLConnection
2.0 -3.0 NSURLSession + NSURLConnection
3.0 + NSURLSession
56.若是服務器返回的數據不是JSON數據,那麼在使用AFN發送網絡請求的時候會請求失敗請問是什麼緣由產生的?如何解決?
57.在使用NSURLSession進行文件上傳的時候,如何監聽文件上傳的進度,有哪些注意點?
- 建立會話對象的時候,須要設置代理,讓控制器成爲session的代理
- 遵照代理協議(NSURLSessionDataDelegate)
- 實現代理方法,在代理方法中計算文件的上傳進度
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task
didSendBodyData:(int64_t)bytesSent
totalBytesSent:(int64_t)totalBytesSent
totalBytesExpectedToSend:(int64_t)totalBytesExpectedToSend
- 注意:當任務執行完畢的時候應該釋放對代理對象的強引用
58.請簡單說明系統默認提供的NSURLSessionConfiguration三種配置信息?
- "defaultSessionConfiguration"返回標準配置,這實際上與NSURLConnection的網絡協議棧是同樣的,具備相同的共享NSHTTPCookieStorage,共享NSURLCache和共享NSURLCredentialStorage
- "ephemeralSessionConfiguration"返回一個預設配置,沒有持久性存儲的緩存,Cookie或證書。這對於實現像"祕密瀏覽"功能的功能來講,是很理想的
- "backgroundSessionConfiguration":獨特之處在於,它會建立一個後臺會話。後臺會話不一樣於常規的,普通的會話,它甚至能夠在應用程序掛起,退出,崩潰的狀況下運行上傳和下載任務。初始化時指定的標識符,被用於向任何可能在進程外恢復後臺傳輸的守護進程提供上下文
59.在發送網絡請求的時候,若是一個參數(place)須要對應着多個值,那麼如下兩種請求路徑哪一種是正確的?
①:[http://192.168.31.520:1314/loveyou?place=Beijing&Shanghai](http://120.25.226.186:32812/weather?place=Beijing&Shanghai)
②:[http://](http://120.25.226.186:32812/weather?place=Beijing&place=Shanghai)[192.168.31.520:1314](http://120.25.226.186:32812/weather?place=Beijing&Shanghai)/loveyou?place=Beijing&place=Shanghai
第二種請求路徑是正確的,第一種是錯誤的,後面的shanghai將會被忽略
60.使用AFN進行文件下載相對於NSURLSessionDownloadTask而言有何好處?
- 能夠很方便的監聽文件的下載進度
- NSURLSessionDownloadTask在實現文件下載的時候,內部默認把文件下載到了tmp臨時路徑,等下載完畢以後咱們須要執行一個剪切操做
- AFN下載請求的實現內部基於NSURLSessionDownloadTask,在使用的時候只須要告知AFN應該把文件剪切到什麼路徑,那麼AFN內部會自動的進行文件剪切處理
61.請簡單回答網絡安全的原則是什麼?
- 在網絡上"不容許"傳輸用戶隱私數據的"明文"
- 在本地"不容許"保存用戶隱私數據的"明文"
62.請簡單介紹下Base64編碼?
- 特色:能夠將任意的二進制數據進行Base64編碼
- 結果:全部的數據都能被編碼爲並只用65個字符就能表示的文本文件。65字符:A~Z a~z 0~9 + / =
- 對文件進行base64編碼後文件數據的變化:編碼後的數據~=編碼前數據的4/3,會大1/3左右。
- Base64編碼原理:
- 將全部字符轉化爲ASCII碼;
- 將ASCII碼轉化爲8位二進制;
- 將二進制3個歸成一組(不足3個在後邊補0)共24位,再拆分紅4組,每組6位;
- 統一在6位二進制前補兩個0湊足8位;
- 將補0後的二進制轉爲十進制;
- 從Base64編碼表獲取十進制對應的Base64編碼
63.請簡單說明單向散列函數的特色?
- 加密後密文的長度是定長的
- 若是明文不同,那麼散列後的結果必定不同
- 若是明文同樣,那麼加密後的密文必定同樣(對相同數據加密,加密後的密文同樣)
- 全部的加密算法是公開的
- 不能夠逆推反算
- 不可逆
- 原文相同 散列值相同
- 原文不一樣 散列值不一樣
- 加密後密文的長度是定長的
64.請簡單介紹下散列函數的一些應用領域?
- 搜索 多個關鍵字,先對每一個關鍵字進行散列,而後多個關鍵字進行或運算,若是值一致則搜索結果一致
- 版權 對文件進行散列判斷該文件是不是正版或原版的
- 文件完整性驗證 對整個文件進行散列,比較散列值判斷文件是否完整或被篡改
65.請簡單介紹下對稱加密的特色和經典算法?
- 特色:
- 加密和解密使用相同的祕鑰
- 加密和解密的過程是可逆的
- 性能好,效率高
- 經典算法
- DES 數據加密標準
- 3DES 使用3個密鑰,對消息進行(密鑰1·加密)+(密鑰2·解密)+(密鑰3·加密)
- AES 高級加密標準
66.請簡單說明ECB和CBC兩種分組加密模式?
- ECB模式的全稱爲Electronic CodeBook模式。又成爲電子密碼本模式。
- 特色:
- 使用ECB模式加密的時候,相同的明文分組會被轉換爲相同的密文分組。
- 相似於一個巨大的明文分組——密文分組的對照表。
- CBC模式全稱爲Cipher Block Chainning模式(密文分組連接模式|電子密碼鏈條)
- 特色:
- 在CBC模式中,首先將明文分組與前一個密文分組進行XOR運算,而後再進行加密。
67.請簡單介紹下非對稱加密的特色和經典算法?
- 非對稱加密的特色:
- 使用一個密鑰對進行加密和解密,公鑰加密,私鑰解密
- 公鑰是公開的,私鑰是保密的
- 使用非對稱加密來處理加密和解密的過程高度安全,可是效率低下,性能不好
- 經典算法:RSA
68.請簡單介紹下數字簽名這門技術?
- 應用場景:須要嚴格驗證發送方身份信息狀況
- 數字簽名原理
- 客戶端處理
- 對"消息"進行 HASH 獲得 "消息摘要"
- 發送方使用本身的私鑰對"消息摘要" 加密(數字簽名)
- 把數字簽名附着在"報文"的末尾一塊兒發送給接收方
- 服務端處理
- 對"消息" HASH 獲得 "報文摘要"
- 使用公鑰對"數字簽名" 解密
- 對結果進行匹配
69.數字證書和公鑰什麼關係?
- 數字證書就是對公鑰進行數字簽名
- 證書和駕照很類似,裏面記有姓名、組織、地址等我的信息,以及屬於此人的公鑰,並有認證機構施加數字簽名,只要看到公鑰證書,咱們就能夠知道認證機構認證該公鑰的確屬於此人
- 數字證書的主要內容:
- 公鑰
- 認證機構的數字簽名
70.請簡單說明在安裝cocoapods時,使用pod install命令安裝框架後的大體過程?
- 分析依賴:該步驟會分析Podfile,查看不一樣類庫之間的依賴狀況。若是有多個類庫依賴於同一個類庫,可是依賴於不一樣的版本,那麼cocoaPods會自動設置一個兼容的版本。
- 下載依賴:根據分析依賴的結果,下載指定版本的類庫到本地項目中。
- 生成Pods項目:建立一個Pods項目專門用來編譯和管理第三方框架,CocoaPods會將所需的框架,庫等內容添加到項目中,而且進行相應的配置。
- 整合Pods項目:將Pods和項目整合到一個工做空間中,而且設置文件連接。
[reply]PDF3文件下載[/reply]