iOS面試題:NSCache,NSDictionary,NSArray的區(qū)別

1. NSArray

NSArray作為一個存儲對象的有序集合,可能是被使用最多的集合類。

性能特征
在數(shù)組的開頭和結(jié)尾插入/刪除元素通常是一個O(1)操作,而隨機(jī)的插入/刪除通常是 O(N)的。

有用的方法
NSArray的大多數(shù)方法使用isEqual:來檢查對象間的關(guān)系(例如containsObject:)。有一個特別的方法

indexOfObjectIdenticalTo:

用來檢查指針相等,如果你確保在同一個集合中搜索,那么這個方法可以很大的提升搜索速度。

更多相關(guān)資料參考

2. NSDictionary

一個字典存儲任意的對象鍵值對。 由于歷史原因,初始化方法使用相反的對象到值的方法,

[NSDictionary dictionaryWithObjectsAndKeys:object, key, nil]

而新的快捷語法則從key開始

@{key : value, ...}

NSDictionary中的鍵是被拷貝的并且需要是恒定的。如果在一個鍵在被用于在字典中放入一個值后被改變,那么這個值可能就會變得無法獲取了。一個有趣的細(xì)節(jié),在NSDictionary中鍵是被拷貝的,而在使用一個toll-free橋接的CFDictionary時(shí)卻只被retain。CoreFoundation類沒有通用對象的拷貝方法,因此這時(shí)拷貝是不可能的(*)。這只適用于使用CFDictionarySetValue()的時(shí)候。如果通過setObject:forKey使用toll-free橋接的CFDictionary,蘋果增加了額外處理邏輯來使鍵被拷貝。反過來這個結(jié)論則不成立 — 轉(zhuǎn)換為CFDictionary的NSDictionary對象,對其使用CFDictionarySetValue()方法會調(diào)用回setObject:forKey并拷貝鍵。

3. NSCache

NSCache是一個非常奇怪的集合。在iOS 4/Snow Leopard中加入,默認(rèn)為可變并且線程安全的。這使它很適合緩存那些創(chuàng)建起來代價(jià)高昂的對象。它自動對內(nèi)存警告做出反應(yīng)并基于可設(shè)置的成本清理自己。與NSDictionary相比,鍵是被retain而不是被拷貝的。

NSCache的回收方法是不確定的,在文檔中也沒有說明。向里面放一些類似圖片那樣比被回收更快填滿內(nèi)存的大對象不是個好主意。(這是在PSPDFKit中很多跟內(nèi)存有關(guān)的crash的原因,在使用自定義的基于LRU的鏈表的緩存代碼之前,我們起初使用NSCache存儲事先渲染的圖片。)

NSCache可以設(shè)置撐自動回收實(shí)現(xiàn)了NSDiscardableContent協(xié)議的對象。實(shí)現(xiàn)該屬性的一個比較流行的類是同時(shí)間加入的NSPurgeableData,但是在OS X 10.9之前,是非線程安全的(沒有信息表明這是否也影響到iOS或者是否在iOS 7中被修復(fù)了)。

NSCache性能

那么NSCache如何承受NSMutableDictionary的考驗(yàn)?加入的線程安全必然會帶來一些消耗。

4. iOS 構(gòu)建緩存時(shí)選 NSCache 而非NSDictionary
  • 當(dāng)系統(tǒng)資源將要耗盡時(shí),NSCache可以自動刪減緩存。如果采用普通的字典,那么就要自己編寫掛鉤,在系統(tǒng)通知時(shí)手動刪減緩存,NSCache會先行刪減 時(shí)間最久為被使用的對象

  • NSCache 并不會拷貝鍵,而是會保留它。此行為用NSDictionary也可以實(shí)現(xiàn),但是需要編寫比較復(fù)雜的代碼。NSCache對象不拷貝鍵的原因在于,很多時(shí)候鍵都是不支持拷貝操作的對象來充當(dāng)?shù)摹R虼薔SCache對象不會自動拷貝鍵,所以在鍵不支持拷貝操作的情況下,該類比字典用起來更方便

  • NScache是線程安全的,NSDictionary不是。在開發(fā)者自己不編寫加鎖代碼的前提下,多個線程可以同時(shí)訪問NSCache。對緩存來說,線程安全通常是很重要的,因?yàn)殚_發(fā)者可能在某個線程中讀取數(shù)據(jù),此時(shí)如果發(fā)現(xiàn)緩存里找不著指定的鍵,那么就要下載該鍵對應(yīng)的數(shù)據(jù)了


更多:iOS面試題合集

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容