iOS中的集合該如何弱引用對象示例詳解
前言
本文主要給大家介紹了關(guān)于iOS集合弱引用對象的相關(guān)內(nèi)容,分享出來供大家參考學(xué)習(xí),下面話不多說了,來一起看看詳細(xì)的介紹吧。
1. 使用 NSValue
NSValue 可以弱引用保存一個對象,我們可以使用這種方法間接的引用。
NSValue *value = [NSValue valueWithNonretainedObject:@selector(class)]; [array addObject:value];
2. 使用 NSPointerArray,NSMapTable,NSHashTable
以上三個類型的用法分別對應(yīng) NSMutableArray,NSMutableDictionary,NSMutableSet。
NSPointerArray
NSPointerArray 和 NSMutableArray 一樣同是有序可變集合,可插入、刪除成員; 不同的是可以存儲 NULL,且 count 可變,用 NULL 來填充。
// 實(shí)例化方法 - (instancetype)initWithOptions:(NSPointerFunctionsOptions)options; - (instancetype)initWithPointerFunctions:(NSPointerFunctions *)functions;
NSPointerFunctionsOptions 枚舉定義著內(nèi)存管理策略、方法特性和內(nèi)存標(biāo)識,以下是幾個常用的枚舉值:
內(nèi)存管理策略:
- NSPointerFunctionsStrongMemory:強(qiáng)引用成員
- NSPointerFunctionsMallocMemory 與 NSPointerFunctionsMachVirtualMemory: 用于 Mach 的 虛擬內(nèi)存管理
- NSPointerFunctionsWeakMemory:弱引用成員
方法特性:
- NSPointerFunctionsObjectPersonality:hash、isEqual、對象描述
- NSPointerFunctionsOpaquePersonality:pointer 的 hash 、直接判等
內(nèi)存標(biāo)識:
- NSPointerFunctionsCopyIn 添加成員時進(jìn)行 copy 操作
選用多種組合方式:
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 修飾時,任意一方在內(nèi)存中被釋放都會移除該鍵值對。
NSHashTable
NSHashTable 使用方法類似于 NSMutableSet,只不過該類型的 allObjectes 屬性返回的是一個 NSArray,會對成員強(qiáng)引用。
3. 根據(jù) NSValue 的思路自己寫一個類
新建一個 WeakRef 類:
@interface WeakRef : NSObject @property (nonatomic, weak) id ref; @end
使用:
WeakRef *weakRef = [WeakRef new]; weakRef.ref = xxx; [array addObject:weakRef];
4. 根據(jù) 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])];
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
iOS實(shí)現(xiàn)動態(tài)元素的引導(dǎo)圖效果
這篇文章給大家介紹了iOS實(shí)現(xiàn)動態(tài)元素的引導(dǎo)圖效果的步驟,文章給出了示例代碼介紹的很詳細(xì),有需要的朋友們可以參考借鑒,下面來一起看看吧。2016-09-09iOS開發(fā)技能weak和strong修飾符的規(guī)范使用詳解
這篇文章主要為大家介紹了iOS開發(fā)技能weak和strong修飾符的規(guī)范使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07iOS實(shí)現(xiàn)知乎和途家導(dǎo)航欄漸變的文字動畫效果
這篇文章給大家分享了利用iOS實(shí)現(xiàn)知乎和途家導(dǎo)航欄漸變的文字動畫效果,有需要的朋友們可以參考借鑒。下面來一起看看。2016-09-09React Native學(xué)習(xí)教程之自定義NavigationBar詳解
這篇文章主要給大家介紹了關(guān)于React Native學(xué)習(xí)教程之自定義NavigationBar的相關(guān)資料,文中通過是示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-10-10iOS開發(fā)之統(tǒng)計(jì)Xcode工程的代碼行數(shù)
這篇文章主要給大家介紹了在iOS開發(fā)中,如果想要統(tǒng)計(jì)Xcode工程的代碼行數(shù)該如何實(shí)現(xiàn),文章給出了詳細(xì)的方法和示例代碼,對大家的理解和學(xué)習(xí)很有幫助,本文中還分享了統(tǒng)計(jì)java文件和xml文件的代碼,有需要的朋友們下面來一起看看吧。2016-10-10IOS 出現(xiàn)問題POST網(wǎng)絡(luò)請求狀態(tài)code:500的解決方法
這篇文章主要介紹了IOS 出現(xiàn)問題POST網(wǎng)絡(luò)請求狀態(tài)code:500的解決方法的相關(guān)資料,需要的朋友可以參考下2017-02-02