iOS小記-NSPointArray、NSHashTable和NSMapTable

Foudation 框架中我們常用的數(shù)據(jù)集合類型有:NSSet、NSDictionaryNSArray。實(shí)際上蘋果在 iOS6 之后也推出過(guò)與之一一對(duì)應(yīng)的NSHashTable、NSMapTableNSPointArray,只不過(guò)因?yàn)榍罢吖δ茌^為強(qiáng)大,能解決平時(shí)開(kāi)發(fā)中遇到的大部分問(wèn)題,因此更被大家所熟知。

NSPointArray

在數(shù)組中添加一個(gè)對(duì)象時(shí),會(huì)使得對(duì)象引用計(jì)數(shù)器+1,被數(shù)組所持有。如果希望在數(shù)據(jù)容器中保持對(duì)對(duì)象弱引用,對(duì)象移除時(shí),數(shù)組中也隨之移除時(shí),該如何處理呢?
在 iOS6 之前可以調(diào)用NSValuevalueWithNonretainedObject方法去弱化這個(gè)對(duì)象,然后在加到數(shù)據(jù)集合中可以達(dá)到上述要求。

NSValue *value = [NSValue valueWithNonretainedObject:obj];
NSArray *array = [NSArray arrayWithObject:value];

iOS6 之后可以使用NSPointArray來(lái)實(shí)現(xiàn)對(duì)應(yīng)的要求。

///初始化方法
+ (NSPointerArray *)strongObjectsPointerArray;
+ (NSPointerArray *)weakObjectsPointerArray;

使用strongObjectsPointerArray之后得到的數(shù)組就是等同于 NSMutableArray,數(shù)組對(duì)對(duì)象的引用是強(qiáng)引用。
使用weakObjectsPointerArray后得到的數(shù)組對(duì)對(duì)象的持有是弱引用。

因此這樣寫就能滿足剛才的需求:

NSPointerArray *array = [NSPointerArray weakObjectsPointerArray];
[array addPointer:obj];

NSHashTable

NSHashTableNSSet / NSMutableSet 的通用版本, NSHashTable 具有下面這些特性:

 NSSet / NSMutableSet 持有成員的強(qiáng)引用,通過(guò) hash 和 isEqual: 方法來(lái)檢測(cè)成員的散列值和相等性。
 NSHashTable 是可變的,沒(méi)有不可變的對(duì)應(yīng)版本。
 NSHashTable 可以持有成員的弱引用。
 NSHashTable 可以在加入成員時(shí)進(jìn)行 copy 操作。
 NSHashTable 可以存儲(chǔ)任意的指針,通過(guò)指針來(lái)進(jìn)行相等性和散列檢查。

NSMapTable

NSMapTableNSDictionary 的通用版本。和 NSDictionary / NSMutableDictionary 不同的是,NSMapTable 具有下面這些特性:

 NSDictionary / NSMutableDictionary 對(duì)鍵進(jìn)行拷貝,對(duì)值持有強(qiáng)引用。
 NSMapTable 是可變的,沒(méi)有不可變的對(duì)應(yīng)版本。
 NSMapTable 可以持有鍵和值的弱引用,當(dāng)鍵或者值當(dāng)中的一個(gè)被釋放時(shí),整個(gè)這一項(xiàng)就會(huì)被移除掉。
 NSMapTable 可以在加入成員時(shí)進(jìn)行 copy 操作。
 NSMapTable 可以存儲(chǔ)任意的指針,通過(guò)指針來(lái)進(jìn)行相等性和散列檢查。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 卷首語(yǔ) 歡迎來(lái)到 objc.io 第七期! 這個(gè)月,我們選擇了 Foundation 框架作為我們的主題。 Fou...
    評(píng)評(píng)分分閱讀 1,670評(píng)論 0 8
  • 一個(gè)項(xiàng)目中的需求 在iOS項(xiàng)目開(kāi)發(fā)過(guò)程中,我們經(jīng)常會(huì)使用到NSSet、NSArray、NSDictionary三個(gè)...
    肖浩唄閱讀 31,377評(píng)論 7 79
  • 站在前輩的肩膀上前行 UIKit框架和Foundation框架 所有的Mac OS X和IOS程序都是由大量的對(duì)象...
    zysmoon閱讀 8,946評(píng)論 0 16
  • NSSet和NSDictionary 兩個(gè)常用的類,它們默認(rèn)假定了其中對(duì)象的內(nèi)存行為。對(duì)于NSSet來(lái)說(shuō),obje...
    taosiyu閱讀 5,313評(píng)論 0 2
  • 這個(gè)題目,源于我的文章中的一篇評(píng)論,起初,并不覺(jué)得這個(gè)評(píng)論有多少新穎之處,可是,今天文思如泉涌,看著這個(gè)點(diǎn)睛之筆,...
    漿糊郎中閱讀 267評(píng)論 0 0

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