iOS中的集合该如何弱引用对象示例详解

 更新时间:2017年09月12日 10:48:19   作者:暮光  
这篇文章主要给大家介绍了关于在iOS中的集合该如何弱引用对象的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来依稀学习学习吧。

前言

本文主要给大家介绍了关于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])];

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

您可能感兴趣的文章:

相关文章

  • ios的签名机制详解

    ios的签名机制详解

    这篇文章主要介绍了ios的签名机制的相关资料,帮助大家更好的理解和学习使用ios开发,感兴趣的朋友可以了解下
    2021-04-04
  • iOS自定义日期、时间、城市选择器实例代码

    iOS自定义日期、时间、城市选择器实例代码

    这篇文章主要介绍了iOS自定义日期、时间、城市选择器实例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • 详解iOS App中UISwitch开关组件的基本创建及使用方法

    详解iOS App中UISwitch开关组件的基本创建及使用方法

    UISwitch组件就是我们平时在iOS设置菜单中开到的那种左右滑动的开关按钮,当然我们在开发时可以进行更多的自定义,这里我们就来详解iOS App中UISwitch开关组件的基本创建及使用方法
    2016-05-05
  • iOS StoreKit 2 新特性盘点解析

    iOS StoreKit 2 新特性盘点解析

    这篇文章主要为大家介绍了iOS StoreKit 2 新特性盘点及要点解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • 一文详解NSSecureCoding真的安全吗

    一文详解NSSecureCoding真的安全吗

    这篇文章主要为大家介绍了NSSecureCoding安全深入解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • iOS开发之离线地图核心代码

    iOS开发之离线地图核心代码

    本文给大家分享ios开发之离线地图核心代码,代码简单易懂,非常实用,有需要的朋友参考下
    2016-04-04
  • iOS Webview自适应实际内容高度的4种方法详解

    iOS Webview自适应实际内容高度的4种方法详解

    这篇文章主要介绍了iOS Webview自适应实际内容高度的4种方法详解,本文介绍的非常详细,具有参考借鉴价值,需要的朋友可以参考下
    2016-09-09
  • 一个方法搞定iOS下拉放大及上推缩小

    一个方法搞定iOS下拉放大及上推缩小

    在很多的APP中,我们可以看到一个列表顶部的图片会随着下拉会放大,随着上推缩小。这样的效果没能给定一个固有名词,现在本文介绍使用代码实现这样的效果,代码量很少,容易理解。当然实现效果是很好的。
    2016-07-07
  • iOS小数取整的方法(ceil floor round)示例

    iOS小数取整的方法(ceil floor round)示例

    这篇文章主要为大家介绍了iOS小数取整的方法(ceil floor round)示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • iOS开发微信收款到账语音提醒功能思路详解

    iOS开发微信收款到账语音提醒功能思路详解

    这篇文章主要介绍了iOS开发微信收款到账语音提醒功能思路详解,需要的朋友可以参考下
    2017-09-09

最新评论