iOS面試問答集錦,從容應對各種面試技術難題!

weixin_33895657發表於2018-06-21

序言

一個好的面試問題能使應聘者的本性顯露出來——誠實,可信,反應敏銳等等。
長期以來,我收集了一些自己在面試中總會用到的問題,這裡整理出許多個最有價值的。希望這個總結能為面試官和應聘者提供一些參考,若你能輕而易舉回答所有問題,面試就不必擔心了。

面試題

1. http和scoket通訊的區別?socket連線相關庫,TCP,UDP的連線方法,HTTP的幾種常用方式?

httpscoket通訊的區別:

http是客戶端用http協議進行請求,傳送請求時候需要封裝http請求頭,並繫結請求的資料,伺服器一般有web伺服器配合(當然也非絕對)。http請求方式為客戶端主動發起請求,伺服器才能給響應,一次請求完畢後則斷開連線,以節省資源。伺服器不能主動給客戶端響應(除非採取http長連線技術)。iphone主要使用類是NSUrlConnection
scoket是客戶端跟伺服器直接使用socket“套接字”進行連線,並沒有規定連線後斷開,所以客戶端和伺服器可以保持連線通道,雙方都可以主動傳送資料。一般在遊戲開發或股票開發這種要求即時性很強並且保持傳送資料量比較大的場合使用。主要使用類是CFSocketRef

2.HTTP請求常用的幾種方式

  • GET:獲取指定資源
  • POST:2M 向指定資源提交資料進行處理請求,在RESTful 風格用於新增資源
  • HEAD:獲取指定資源頭部資訊
  • PUT :替換指定資源(不支援瀏覽器操作)
  • DELETE: 刪除指定資源

3.框架 SDWebimage的快取機制

1.UIImageView+WebCache: setImageWithURL:placeholderImage:options: 先顯示 placeholderImage ,
同時由SDWebImageManager 根據 URL 來在本地查詢圖片。
2.SDWebImageManager: downloadWithURL:delegate:options:userInfo: 
SDWebImageManager是將UIImageView+WebCache同SDImageCache連結起來的類,
 SDImageCache: queryDiskCacheForKey:delegate:userInfo:
用來從快取根據CacheKey查詢圖片是否已經在快取中
3.如果記憶體中已經有圖片快取, SDWebImageManager會回撥SDImageCacheDelegate : imageCache:didFindImage:forKey:userInfo:
4.而 UIImageView+WebCache 則回撥SDWebImageManagerDelegate:  webImageManager:didFinishWithImage:來顯示圖片。
5.如果記憶體中沒有圖片快取,那麼生成 NSInvocationOperation 新增到佇列,從硬碟查詢圖片是否已被下載快取。
6.根據 URLKey 在硬碟快取目錄下嘗試讀取圖片檔案。這一步是在 NSOperation 進行的操作,所以回主執行緒進行結果回撥 
7.notifyDelegate:
8.如果上一操作從硬碟讀取到了圖片,將圖片新增到記憶體快取中(如果空閒記憶體過小,會先清空記憶體快取)。
SDImageCacheDelegate 回撥 imageCache:didFindImage:forKey:userInfo:進而回撥展示圖片。
9.如果從硬碟快取目錄讀取不到圖片,說明所有快取都不存在該圖片,需要下載圖片,回撥 
10.imageCache:didNotFindImageForKey:userInfo:
11.共享或重新生成一個下載器 SDWebImageDownloader 開始下載圖片。
12.圖片下載由 NSURLConnection 來做,實現相關 delegate 來判斷圖片下載中、下載完成和下載失敗。
13.connection:didReceiveData: 中利用 ImageIO 做了按圖片下載進度載入效果。
14.connectionDidFinishLoading: 資料下載完成後交給 SDWebImageDecoder 做圖片解碼處理。
15.圖片解碼處理在一個 NSOperationQueue 完成,不會拖慢主執行緒 UI。
如果有需要對下載的圖片進行二次處理,最好也在這裡完成,效率會好很多。
16.在主執行緒 notifyDelegateOnMainThreadWithInfo: 宣告解碼完成,imageDecoder:didFinishDecodingImage:userInfo:
 回撥給 SDWebImageDownloader。
17.imageDownloader:didFinishWithImage: 回撥給 SDWebImageManager 告知圖片下載完成。
18.通知所有的 downloadDelegates 下載完成,回撥給需要的地方展示圖片。
19.將圖片儲存到 SDImageCache 中,記憶體快取和硬碟快取同時儲存。
20.寫檔案到硬碟在單獨 NSInvocationOperation 中完成,避免拖慢主執行緒。
21.如果是在iOS上執行,SDImageCache 在初始化的時候會註冊notification 到 UIApplicationDidReceiveMemoryWarningNotification 
以及  UIApplicationWillTerminateNotification,在記憶體警告的時候清理記憶體圖片快取,應用結束的時候清理過期圖片。
22.SDWebImagePrefetcher 可以預先下載圖片,方便後續使用。

4.iOS App升級安裝 - CoreData資料庫升級

  • 選中你的mydata.xcdatamodeld檔案,選擇選單editor->Add Model Version 比如取名:mydata2.xcdatamodel
  • 設定當前版本
  • 修改新資料模型mydata2,在新的檔案上新增欄位及表
  • 刪除原來的類檔案,重新生成下類。在appdelegate中新增 *optionsDictionary,原來options:nil 改成options:optionsDictionary
  • 重新編譯下程式。
  • 增加模型版本——->選擇最新的版本——->選擇表,新增欄位——>刪除之前的類,重新生成。

5.Objective-C堆和棧的區別?

  • 管理方式:對於棧來講,是由編譯器自動管理,無需我們手工控制;對於堆來說,釋放工作由程式設計師控制,容易產生memory leak
    申請大小:

  • 棧:在Windows下,棧是向低地址擴充套件的資料結構,是一塊連續的記憶體的區域。這句話的意思是棧頂的地址和棧的最大容量是系統預先規定好的,在 WINDOWS下,棧的大小是2M(也有的說是1M,總之是一個編譯時就確定的常數),如果申請的空間超過棧的剩餘空間時,將提示overflow。因 此,能從棧獲得的空間較小。

  • 堆:堆是向高地址擴充套件的資料結構,是不連續的記憶體區域。這是由於系統是用連結串列來儲存的空閒記憶體地址的,自然是不連續的,而連結串列的遍歷方向是由低地址向高地址。堆的大小受限於計算機系統中有效的虛擬記憶體。由此可見,堆獲得的空間比較靈活,也比較大。

  • 碎片問題:對於堆來講,頻繁的new/delete勢必會造成記憶體空間的不連續,從而造成大量的碎片,使程式效率降低。對於棧來講,則不會存在這個問題,因為棧是先進後出的佇列,他們是如此的一一對應,以至於永遠都不可能有一個記憶體塊從棧中間彈出

  • 分配方式:堆都是動態分配的,沒有靜態分配的堆。棧有2種分配方式:靜態分配和動態分配。靜態分配是編譯器完成的,比如區域性變數的分配。動態分配由alloca函式進行分配,但是棧的動態分配和堆是不同的,他的動態分配是由編譯器進行釋放,無需我們手工實現。

  • 分配效率:棧是機器系統提供的資料結構,計算機會在底層對棧提供支援:分配專門的暫存器存放棧的地址,壓棧出棧都有專門的指令執行,這就決定了棧的效率比較高。堆則是C/C++函式庫提供的,它的機制是很複雜的。

6.AFN的實現原理

AFN的直接操作物件AFHTTPClient不同於ASI,是一個實現了NSCodingNSCopying協議的NSObject子類。 AFHTTPClient是一個封裝了一系列操作方法的“工具類”,處理請求的操作類是一系列單獨的,基於NSOperation封裝 的,AFURLConnectionOperation的子類。AFN的示例程式碼中通過一個靜態方法,使用dispatch_once()的方式建立AFHTTPClient的共享例項,這也是官方建議的使用方法。在建立AFHTTPClient的初始化方法中,建立了OperationQueue並 設定一系列引數預設值。在getPath:parameters:success:failure方法中建立NSURLRequest,以NSURLRequest物件例項作為引數,建立一個NSOperation,並加入在初始化發方中建立的NSOperationQueue。以上操作都 是在主執行緒中完成的。在NSOperationstart方法中,以此前建立的NSURLRequest物件為引數建立NSURLConnection 並開啟連結。

7.imageName和ImageWithContextOfFile的區別?哪個效能高

imageNamed的方式載入時,圖片使用完畢後快取到記憶體中,記憶體消耗多,載入速度快。即使生成的物件被 autoReleasePool釋放了,這份快取也不釋放,如果影像比較大,或者影像比較多,用這種方式會消耗很大的記憶體。
imageNamed採用了快取機制,如果快取中已載入了圖片,直接從快取讀就行了,每次就不用再去讀檔案了,效率會更高 。
ImageWithContextOfFile載入,圖片是不會快取的,載入速度慢。
大量使用imageNamed方式會在不需要快取的地方額外增加開銷CPU的時間.當應用程式需要載入一張比較大的圖片並且使用一次性,那麼其實是沒有必要去快取這個圖片的,用imageWithContentsOfFile是最為經濟的方式,這樣不會因為UIImage元素較多情況下,CPU會被逐個分散在不必要快取上浪費過多時間.
還有很多的問題大家可以自己思考一下

  • 1.UIView的setNeedsDisplay和setNeedsLayout方法
  • 2.int和NSInteger的區別
  • 3.建立控制器、檢視的方式
  • 4 簡述記憶體分割槽情況
  • 5 iOS的系統架構
  • 6 控制元件主要響應3種事件
  • 7 簡述檢視控制元件器的生命週期。
    等等……

最後

沒有人會討厭和拒絕認真準備面試的人,所以不要認為面試就是必須用一個“素顏”的你去“真誠”的面對。

12408001-4dbc527a13d88ec5.png
想了解更多的面試題可以掃一掃.png

{想獲取更多的知識點可以瞭解一下的(https://www.jianshu.com/u/a6ca643f761e)}

相關文章