这篇文章给大家分享的是有关iOS中的集合该怎么弱引用对象的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
10年专注建站、设计、互联网产品定制开发服务,业务涵盖成都品牌网站建设、商城开发、小程序设计、软件系统开发、成都app开发等。凭借多年丰富的经验,我们会仔细了解每个客户的需求而做出多方面的分析、设计、整合,为客户设计出具风格及创意性的商业解决方案,创新互联公司更提供一系列网站制作和网站推广的服务,以推动各中小企业全面信息数字化,并利用创新技术帮助各行业提升企业形象和运营效率。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 、直接判等
内存标识:
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中的集合该怎么弱引用对象”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!
另外有需要云服务器可以了解下创新互联建站www.cdcxhl.com,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。