2018面試題整理

1. runtimerunloop的區別
1.1 runtime
1.2 runloop相關
2. SDWebImage相關
2.1 查找url對應的圖片緩存是否存在
2.2 TableViewCell複用加載圖片的處理
2.3 針對同一圖片連接的不一樣圖片的處理
3. AFNetworking2.0和3.0的區別web

runtimerunloop的區別

runtime

  1. 動態添加對象的成員變量和方法。
  2. 獲取某個類的成員變量和方法。
  3. 爲類別添加屬性

runloop

基本做用

  1. 保持程序的持續運行。
  2. 處理App中的各種事件(觸摸事件、定時器事件等)
  3. 節省CPU資源,提升程序性能(沒有事件時就進入睡眠狀態)

內部實現

do-while循環,在這個循環內不斷地處理各類任務緩存

注意網絡

一個線程對應一個runloop,採用字典存儲,線程號爲key,runloop爲value;併發

主線程的runloop默認已經啓動,子線程的runloop須要手動啓動。oop

runloop在第一次獲取時建立,在線程結束時銷燬。性能

SDWebImage相關

查找url對應的圖片緩存是否存在

UIImage *defaultImg = [UIImage imageNamed:@"defaultimage"];
NSString *urlStr = @"http://n.sinaimg.cn/edu/transform/20160505/pe7k-fxryhhu2274915.png";
//查找對應的圖片緩存,key爲url
UIImage *originalImg = [[SDImageCache sharedImageCache] imageFromDiskCacheForKey:urlStr];
if (originalImg) {
    imgView.image = originalImg;
} else {
    [imgView sd_setImageWithURL:[NSURL URLWithString:urlStr] placeholderImage:defaultImg];
}

TableViewCell複用加載圖片的處理

因爲cell的複用機制,在咱們加載一個cell的時候,ImageView數據源開啓一個下載任務並返回一個Image,當cell重用時,其數據源又會開啓一個下載任務下載新的Image,但關聯的對象是同一個imageView,這個時候直接setImage就會發生錯亂。url

SDWebImage的處理是:線程

  1. imageView對象會關聯一個下載列表(列表是給AnimationImages用的,這個時候會下載多張圖片)。當tableView滑動,imageView重設數據源(url)時,會cancel掉下載列表中全部的任務,而後開啓一個新的下載任務。這樣就保證了只有當前課件的cell對象的imageView對象關聯的下載任務可以回調,不會發生image錯亂。
  2. 同時,SDWebImage管理了一個全局下載隊列(在DownloadManager中),併發量設置爲6。也就是說若是可見cell的數目大於6,就會有部分下載隊列處於等待狀態。並且,在添加下載任務到全局的下載隊列中去的時候,SDWebImage默認是採起LIFO(last in,first out)策略的,具體是在添加下載任務的時候,將上次添加的下載任務添加依賴爲新添加的下載任務。

針對同一圖片連接的不一樣圖片的處理

不少App裏面用戶頭像的url用的都是同一個,因此可能就致使明明已經更新了頭像,可是顯示的圖片仍是原來的,這是由於修改頭像後,圖片的url是不變的,而默認狀況下,SDWebImage對相同的url是優先使用緩存的,所以得加option設置。code

[_userFaceLogo sd_setImageWithURL:[NSURL URLWithString:userDto.userImgUrl] placeholderImage:[UIImage imageNamed:@"head portrait"] options:SDWebImageRefreshCached];

SDWebImageRefreshCached是專門用來處理相同url,圖片不一樣的狀況的。orm

AFNetworking2.0和3.0的區別

3.0以前,底層是經過NSURLConnection來實現的。在3.0以後,也就是在iOS9以後,蘋果使用NSURLSession來管理網絡請求,棄用了NSURLConnection.

相關文章
相關標籤/搜索