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实现简易钟表,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-02-02
  • iOS13适配的实现方法

    iOS13适配的实现方法

    这篇文章主要介绍了iOS13适配的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • iOS实现动态元素的引导图效果

    iOS实现动态元素的引导图效果

    这篇文章给大家介绍了iOS实现动态元素的引导图效果的步骤,文章给出了示例代码介绍的很详细,有需要的朋友们可以参考借鉴,下面来一起看看吧。
    2016-09-09
  • iOS开发技能weak和strong修饰符的规范使用详解

    iOS开发技能weak和strong修饰符的规范使用详解

    这篇文章主要为大家介绍了iOS开发技能weak和strong修饰符的规范使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • iOS实现知乎和途家导航栏渐变的文字动画效果

    iOS实现知乎和途家导航栏渐变的文字动画效果

    这篇文章给大家分享了利用iOS实现知乎和途家导航栏渐变的文字动画效果,有需要的朋友们可以参考借鉴。下面来一起看看。
    2016-09-09
  • iOS开发之路--微博骨架搭建

    iOS开发之路--微博骨架搭建

    本文是IOS开发之路的第四篇,主要讲诉如何一步步搭建起微博的骨架,并附上源码,希望对大家的IOS开发能提供些借鉴
    2014-08-08
  • iOS如何获取当前View所在控制器的方法

    iOS如何获取当前View所在控制器的方法

    在开发iOS的时候经常需要获取当前View所在的控制器,下面小编给大家分享个方法,文章给出了示例代码,对大家的学习和理解很有帮助,下面来一起看看吧。
    2016-09-09
  • React Native学习教程之自定义NavigationBar详解

    React Native学习教程之自定义NavigationBar详解

    这篇文章主要给大家介绍了关于React Native学习教程之自定义NavigationBar的相关资料,文中通过是示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-10-10
  • iOS开发之统计Xcode工程的代码行数

    iOS开发之统计Xcode工程的代码行数

    这篇文章主要给大家介绍了在iOS开发中,如果想要统计Xcode工程的代码行数该如何实现,文章给出了详细的方法和示例代码,对大家的理解和学习很有帮助,本文中还分享了统计java文件和xml文件的代码,有需要的朋友们下面来一起看看吧。
    2016-10-10
  • IOS 出现问题POST网络请求状态code:500的解决方法

    IOS 出现问题POST网络请求状态code:500的解决方法

    这篇文章主要介绍了IOS 出现问题POST网络请求状态code:500的解决方法的相关资料,需要的朋友可以参考下
    2017-02-02

最新评论