NSValue
能夠弱引用保存一個對象,咱們能夠使用這種方法間接的引用。ios
NSValue *value = [NSValue valueWithNonretainedObject:@selector(class)]; [array addObject:value];
以上三個類型的用法分別對應 NSMutableArray
,NSMutableDictionary
,NSMutableSet
。atom
NSPointerArray
和 NSMutableArray
同樣同是有序可變集合,可插入、刪除成員;
不一樣的是能夠存儲 NULL
,且 count
可變,用 NULL
來填充。code
// 實例化方法 - (instancetype)initWithOptions:(NSPointerFunctionsOptions)options; - (instancetype)initWithPointerFunctions:(NSPointerFunctions *)functions;
NSPointerFunctionsOptions
枚舉定義着內存管理策略、方法特性和內存標識,如下是幾個經常使用的枚舉值:對象
內存管理策略:內存
NSPointerFunctionsStrongMemory
:強引用成員NSPointerFunctionsMallocMemory
與 NSPointerFunctionsMachVirtualMemory
: 用於 Mach 的 虛擬內存管理NSPointerFunctionsWeakMemory
:弱引用成員方法特性:get
NSPointerFunctionsObjectPersonality
:hash、isEqual、對象描述NSPointerFunctionsOpaquePersonality
:pointer 的 hash 、直接判等內存標識:博客
NSPointerFunctionsCopyIn
添加成員時進行 copy 操做選用多種組合方式:hash
NSPointerFunctionsOptions options = NSPointerFunctionsStrongMemory | NSPointerFunctionsObjectPersonality | NSPointerFunctionsCopyIn; NSHashTable *table = [NSHashTable hashTableWithOptions:options];
static BOOL IsEqual(const void *item1, const void *item2, NSUInteger (*size)(const void *item)) { return *(const int *)item1 == *(const int *)item2; } NSPointerFunctions *functions = [[NSPointerFunctions alloc] init]; [functions setIsEqualFunction:IsEqual];
NSMapTable
和 NSPointerArray
的初始化方法和使用都相似,不一樣的是 NSMapTable
的 key 和 object 各有不一樣的策略,因此有四種組合:it
key | object |
---|---|
weak | weak |
strong | weak |
weak | strong |
strong | strong |
若是 key 或者 object 是 weak
修飾時,任意一方在內存中被釋放都會移除該鍵值對。內存管理
NSHashTable
使用方法相似於 NSMutableSet
,只不過該類型的 allObjectes
屬性返回的是一個 NSArray
,會對成員強引用。
新建一個 WeakRef
類:
@interface WeakRef : NSObject @property (nonatomic, weak) id ref; @end
使用:
WeakRef *weakRef = [WeakRef new]; weakRef.ref = xxx; [array addObject:weakRef];
聲明和定義一個 block:
typedef id(^WeakRefBlock)(); typedef id(^MakeWeakRefBlock)(id); MakeWeakRefBlock makeWeakRef (id object) { __weak id weakref = object; WeakRefBlock block = ^(){ return weakref; }; return block; }
使用:
[array addObject:makeWeakRef([NSObject new])];