前言
本文主要給大家介紹了關于iOS集合弱引用對象的相關內容,分享出來供大家參考學習,下面話不多說了,來一起看看詳細的介紹吧。
1. 使用 NSValue
NSValue 可以弱引用保存一個對象,我們可以使用這種方法間接的引用。
NSValue *value = [NSValue valueWithNonretainedObject:@selector(class)];[array addObject:value];
2. 使用 NSPointerArray,NSMapTable,NSHashTable
以上三個類型的用法分別對應 NSMutableArray,NSMutableDictionary,NSMutableSet。
NSPointerArray
NSPointerArray 和 NSMutableArray 一樣同是有序可變集合,可插入、刪除成員; 不同的是可以存儲 NULL,且 count 可變,用 NULL 來填充。
// 實例化方法- (instancetype)initWithOptions:(NSPointerFunctionsOptions)options;- (instancetype)initWithPointerFunctions:(NSPointerFunctions *)functions;
NSPointerFunctionsOptions 枚舉定義著內存管理策略、方法特性和內存標識,以下是幾個常用的枚舉值:
內存管理策略:
方法特性:
內存標識:
選用多種組合方式:
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
NSMapTable 和 NSPointerArray 的初始化方法和使用都類似,不同的是 NSMapTable 的 key 和 object 各有不同的策略,所以有四種組合:
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])];
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對武林網的支持。
新聞熱點
疑難解答