Foudation 框架中我們常用的數(shù)據(jù)集合類型有:NSSet、NSDictionary、NSArray。實(shí)際上蘋果在 iOS6 之后也推出過(guò)與之一一對(duì)應(yīng)的NSHashTable、NSMapTable和NSPointArray,只不過(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)用NSValue的valueWithNonretainedObject方法去弱化這個(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
NSHashTable 是 NSSet / 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
NSMapTable 是 NSDictionary 的通用版本。和 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)行相等性和散列檢查。