標籤:

2018最全的iOS面試題及答案(一)

最全的iOS面試題及答案

iOS面試小貼士

———————————————回答好下面的足夠了-------------------------------------

多線程、特別是NSOperation 和 GCD 的內部原理。

運行時機制的原理和運用場景。

SDWebImage的原理。實現機制。如何解決TableView卡的問題。

block和代理的,通知的區別。block的用法需要注意些什麼。

strong,weak,retain,assign,copy nomatic 等的區別。

設計模式,mvc,單利,工廠,代理等的應用場景。

單利的寫法。在單利中創建數組應該注意些什麼。

NSString 的時候用copy和strong的區別。

響應值鏈。

NSTimer 在子線程中應該手動創建NSRunLoop ,否則不能循環執行。

UIScrollView和NSTimer組合做循環廣告圖輪播的時候有一個屬性可以控制當上下滾動tableview的時候廣告輪播圖依然正常滾動。

Xcode最新的自動布局。。。這個很多公司都用。盡量自學下。

git ,和svn的用法。。。git的幾個命令簡單的記下。。。

友盟報錯可以查到具體某一行的錯誤,原理是什麼。

Instrument 可以檢測 電池的耗電量、和內存的消耗。的用法。

動畫CABaseAnimation CAKeyAni…. CATrans….. CAGoup…. 等熟悉。。

ARC的原理。

自己寫過什麼自定義控制項就最好了。。

———————————————回答好上面的足夠了-------------------------------------

__block和__weak修飾符的區別其實是挺明顯的:

1.__block不管是ARC還是MRC模式下都可以使用,可以修飾對象,還可以修飾基本數據類型。

2.__weak只能在ARC模式下使用,也只能修飾對象(NSString),不能修飾基本數據類型(int)。

3.__block對象可以在block中被重新賦值,__weak不可以。

tableView 滑動卡的問題主要是因為:從緩存中或者是從本地讀取圖片給UIImage的時候耗費的時間。需要把下面的兩句話放到子線程裡面:

NSData *imgData = [NSData dataWithContentsOfURL:[NSURL URLWithString:app.icon]]; //得到圖像數據

UIImage *image = [UIImage imageWithData:imgData];

把UIImage賦值給圖片的時候在主線程。

子線程不能更新UI 所有的UI跟新都是主線程執行了。手指滑動屏幕了。或者屏幕的某個方法執行了。

子線程裡面加入NSTimer 的時候需要 手動添加NSRunloop 否則不能循環。

單利裡面添加 NSMutableArray 的時候,防止多個地方對它同時便利和修改的話,需要加原子屬性。並且用strong,,,並且寫一個遍歷和修改的方法。加上鎖。 Lock UnLock

__weakViewController* weakSelf =self;

GCD裡面用 __weak 防止內存釋放不了,循環引用。

二、SDWebImage內部實現過程

入口 setImageWithURL:placeholderImage:options: 會先把 placeholderImage 顯示,然後 SDWebImageManager 根據 URL 開始處理圖片。

進入 SDWebImageManager-downloadWithURL:delegate:options:userInfo:,交給 SDImageCache 從緩存查找圖片是否已經下載 queryDiskCacheForKey:delegate:userInfo:.

先從內存圖片緩存查找是否有圖片,如果內存中已經有圖片緩存,SDImageCacheDelegate 回調 imageCache:didFindImage:forKey:userInfo: 到 SDWebImageManager。

SDWebImageManagerDelegate 回調 webImageManager:didFinishWithImage: 到 UIImageView+WebCache 等前端展示圖片。

如果內存緩存中沒有,生成 NSInvocationOperation 添加到隊列開始從硬碟查找圖片是否已經緩存。

根據 URLKey 在硬碟緩存目錄下嘗試讀取圖片文件。這一步是在 NSOperation 進行的操作,所以回主線程進行結果回調 notifyDelegate:。

如果上一操作從硬碟讀取到了圖片,將圖片添加到內存緩存中(如果空閑內存過小,會先清空內存緩存)。SDImageCacheDelegate 回調 imageCache:didFindImage:forKey:userInfo:。進而回調展示圖片。

如果從硬碟緩存目錄讀取不到圖片,說明所有緩存都不存在該圖片,需要下載圖片,回調 imageCache:didNotFindImageForKey:userInfo:。

共享或重新生成一個下載器 SDWebImageDownloader 開始下載圖片。

圖片下載由 NSURLConnection 來做,實現相關 delegate 來判斷圖片下載中、下載完成和下載失敗。

connection:didReceiveData: 中利用 ImageIO 做了按圖片下載進度載入效果。

connectionDidFinishLoading: 數據下載完成後交給 SDWebImageDecoder 做圖片解碼處理。

圖片解碼處理在一個 NSOperationQueue 完成,不會拖慢主線程 UI。如果有需要對下載的圖片進行二次處理,最好也在這裡完成,效率會好很多。

在主線程 notifyDelegateOnMainThreadWithInfo: 宣告解碼完成,imageDecoder:didFinishDecodingImage:userInfo: 回調給 SDWebImageDownloader。

imageDownloader:didFinishWithImage: 回調給 SDWebImageManager 告知圖片下載完成。

通知所有的 downloadDelegates 下載完成,回調給需要的地方展示圖片。

將圖片保存到 SDImageCache 中,內存緩存和硬碟緩存同時保存。寫文件到硬碟也在以單獨 NSInvocationOperation 完成,避免拖慢主線程。

SDImageCache 在初始化的時候會註冊一些消息通知,在內存警告或退到後台的時候清理內存圖片緩存,應用結束的時候清理過期圖片。

SDWI 也提供了 UIButton+WebCache 和 MKAnnotationView+WebCache,方便使用。

SDWebImagePrefetcher 可以預先下載圖片,方便後續使用。

從上面流程可以看出,當你調用setImageWithURL:方法的時候,他會自動去給你干這麼多事,當你需要在某一具體時刻做事情的時候,你可以覆蓋這些方法。比如在下載某個圖片的過程中要響應一個事件,就覆蓋這個方法:

1

2

3

4

5

6

7

8

9

10

11

//覆蓋方法,指哪打哪,這個方法是下載imagePath2的時候響應

SDWebImageManager manager = [SDWebImageManager sharedManager]; [manager downloadImageWithURL:imagePath2 options:SDWebImageRetryFailed progress:^(NSIntegerreceivedSize,NSIntegerexpectedSize) {NSLog(@"顯示當前進度"); } completed:^(UIImageimage,NSErrorerror, SDImageCacheType cacheType,BOOLfinished,NSURLimageURL) {NSLog(@"下載完成");}];

對於初級來說,用sd_setImageWithURL:的若干個方法就可以實現很好的圖片緩存。

UIButton 的父類是UIControl UIControl的父類是UIView UIView的父類是 UIResponder

http狀態嗎 :302 是請求重定向。500以上是伺服器錯誤。400以上是請求鏈接錯誤或者找不到伺服器。200以上是正確。100以上是請求接受成功。

作者:蘋蘋

鏈接:juejin.im/post/5a965e14

來源:掘金

著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

( 其實作為一個開發者有一個學習的氛圍跟一個交流圈子特別重要,這是我的一個iOS交流群493025485,不管是小白還是大牛都歡迎入駐,大家一起交流成長! )

推薦閱讀:

如何看待蘋果 iOS9 依然支持 iPhone4s?
安卓廠商指紋識別類似於蘋果一樣trustzone?但關機進入recovery雙清,指紋被清除,重啟以後是原始解鎖界面。?
iOSApp間常用的五種通信方式
iOS 開發需要哪些硬體條件?
手機桌面如何布置才能既實用又有逼格?

TAG:iOS |