Foudation
框架中我們常用的數(shù)據(jù)集合類(lèi)型有:NSSet
、NSDictionary
、NSArray
捶箱。實(shí)際上蘋(píng)果在 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ì)象的持有是弱引用音诫。
因此這樣寫(xiě)就能滿(mǎn)足剛才的需求:
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)行相等性和散列檢查覆醇。