iOS 中集合如何弱引用對象

1. 使用 NSValue

NSValue 能夠弱引用保存一個對象,咱們能夠使用這種方法間接的引用。ios

NSValue *value = [NSValue valueWithNonretainedObject:@selector(class)];
[array addObject:value];

2. 使用 NSPointerArray,NSMapTable,NSHashTable

以上三個類型的用法分別對應 NSMutableArrayNSMutableDictionaryNSMutableSetatom

NSPointerArray

NSPointerArrayNSMutableArray 同樣同是有序可變集合,可插入、刪除成員;
不一樣的是能夠存儲 NULL,且 count 可變,用 NULL 來填充。code

// 實例化方法
- (instancetype)initWithOptions:(NSPointerFunctionsOptions)options;
- (instancetype)initWithPointerFunctions:(NSPointerFunctions *)functions;

NSPointerFunctionsOptions 枚舉定義着內存管理策略、方法特性和內存標識,如下是幾個經常使用的枚舉值:對象

  1. 內存管理策略:內存

    • NSPointerFunctionsStrongMemory:強引用成員
    • NSPointerFunctionsMallocMemoryNSPointerFunctionsMachVirtualMemory: 用於 Mach 的 虛擬內存管理
    • NSPointerFunctionsWeakMemory:弱引用成員
  2. 方法特性:get

    • NSPointerFunctionsObjectPersonality:hash、isEqual、對象描述
    • NSPointerFunctionsOpaquePersonality:pointer 的 hash 、直接判等
  3. 內存標識:博客

    • 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

NSMapTableNSPointerArray 的初始化方法和使用都相似,不一樣的是 NSMapTable 的 key 和 object 各有不一樣的策略,因此有四種組合:it

key object
weak weak
strong weak
weak strong
strong strong

若是 key 或者 object 是 weak 修飾時,任意一方在內存中被釋放都會移除該鍵值對。內存管理

NSHashTable

NSHashTable 使用方法相似於 NSMutableSet,只不過該類型的 allObjectes 屬性返回的是一個 NSArray,會對成員強引用。

3. 根據 NSValue 的思路本身寫一個類

新建一個 WeakRef 類:

@interface WeakRef : NSObject
@property (nonatomic, weak) id ref;
@end

使用:

WeakRef *weakRef = [WeakRef new];
weakRef.ref = xxx;
[array addObject:weakRef];

4. 根據 NSValue 的思路本身寫一個 block

聲明和定義一個 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])];



個人博客能夠得到更好的閱讀體驗。
相關文章
相關標籤/搜索