美文网首页项目经验iOS扩展眼界
【Objective-C】NSMapTable、NSHashTa

【Objective-C】NSMapTable、NSHashTa

作者: 刘大帅 | 来源:发表于2016-02-19 11:04 被阅读919次

    学习文章

    简单介绍

    即使有了 ARC ,我们有时候也想更精准的控制一个对象的内存管理.我们在用例如 NSDictionary 这样的集合类的时候,它默认持有对象,但有时候,我们只想简单的保留一个对象的弱引用,这时候就会比较麻烦.

    我们需要用NSValue的方法来保证引用计数不变:

    // 存
    [NSValue valueWithNonretainedObject:model]
    
    // 取
    value.nonretainedObjectValue  
    

    上面的使用方式明显太麻烦了,这样,我们今天的主角就登场了. NSMapTable 对应 NSDictionary ; NSHashTable 对应 NSSet ; NSPointerArray 对应 NSArray .它们提供了对象内存管理的方式.

    我们用NSPointerFunctionsOptions来初始化对象的持有方式,或者,用系统提供的相应的类方法.

    如 NSMapTable 中,我们可以用类方法:

    + (NSMapTable<KeyType, ObjectType> *)strongToStrongObjectsMapTable NS_AVAILABLE(10_8, 6_0);
    + (NSMapTable<KeyType, ObjectType> *)weakToStrongObjectsMapTable NS_AVAILABLE(10_8, 6_0); // entries are not necessarily purged right away when the weak key is reclaimed
    + (NSMapTable<KeyType, ObjectType> *)strongToWeakObjectsMapTable NS_AVAILABLE(10_8, 6_0);
    + (NSMapTable<KeyType, ObjectType> *)weakToWeakObjectsMapTable NS_AVAILABLE(10_8, 6_0);  
    

    来指定对象持有方式.

    也可以用初始化方法

    - (instancetype)initWithKeyOptions:(NSPointerFunctionsOptions)keyOptions
                          valueOptions:(NSPointerFunctionsOptions)valueOptions
                              capacity:(NSUInteger)initialCapacity  
    

    选择枚举,来指定对象持有方式.

    最后,我们将其封装成我们习惯的数组/字典/集合的使用方式.

    下面,我们附下YouXianMing对弱引用的封装.

    下载源码

    WeakList

    相关文章

      网友评论

        本文标题:【Objective-C】NSMapTable、NSHashTa

        本文链接:https://www.haomeiwen.com/subject/hgxvkttx.html