国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > iOS > 正文

iOS中的集合該如何弱引用對象示例詳解

2019-10-21 18:44:46
字體:
來源:轉載
供稿:網友

前言

本文主要給大家介紹了關于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 枚舉定義著內存管理策略、方法特性和內存標識,以下是幾個常用的枚舉值:

內存管理策略:

  • NSPointerFunctionsStrongMemory:強引用成員
  • NSPointerFunctionsMallocMemory 與 NSPointerFunctionsMachVirtualMemory: 用于 Mach 的 虛擬內存管理
  • NSPointerFunctionsWeakMemory:弱引用成員

方法特性:

  • NSPointerFunctionsObjectPersonality:hash、isEqual、對象描述
  • NSPointerFunctionsOpaquePersonality:pointer 的 hash 、直接判等

內存標識:

  1. NSPointerFunctionsCopyIn 添加成員時進行 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 修飾時,任意一方在內存中被釋放都會移除該鍵值對。

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])];

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。

 

注:相關教程知識閱讀請移步到IOS開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 阳新县| 大荔县| 泌阳县| 通州市| 灵台县| 武功县| 蒲城县| 水富县| 娄烦县| 额济纳旗| 突泉县| 安溪县| 石台县| 贵溪市| 手游| 喀什市| 自治县| 玛沁县| 昆山市| 苗栗市| 吉木乃县| 马龙县| 班玛县| 兰坪| 安庆市| 兴义市| 巴里| 扶沟县| 淅川县| 垫江县| 祁阳县| 九江县| 佛学| 拉萨市| 石首市| 斗六市| 宿迁市| 萍乡市| 昌乐县| 原阳县| 萍乡市|