美文网首页iOS面试题+基础知识
iOS-如何在数组中使用弱引用(weak reference)

iOS-如何在数组中使用弱引用(weak reference)

作者: 长衣貌 | 来源:发表于2018-08-30 16:46 被阅读0次

    NSPointerArray的用处

    摘要: NSPointerArray的用处 1. 说明 也许你对NSArray使用了如指掌,每个加入到NSArry的对象都会被NSArray持有.有时候,这种特性不是我们想要的结果. 有时候,我们想将对象存储起来,但是不想让数组增加了这个对象的引用计数,这个时候,NSPointArray才是你想要的.

    下面是代码部分

    //.h文件
    #import <Foundation/Foundation.h>
    
    @interface WeakMutableArray : NSObject
    
    /**
     *  获取所有有效的对象
     */
    @property (nonatomic, strong, readonly)  NSArray    *allObjects;
    
    /**
     *  数组中有用对象的个数
     */
    @property (nonatomic, readonly)          NSInteger   usableCount;
    
    /**
     *  数组中所有对象的个数(包括NULL)
     */
    @property (nonatomic, readonly)          NSInteger   allCount;
    
    /**
     *  添加对象
     *
     *  @param object 被添加对象
     */
    - (void)addObject:(id)object;
    
    /**
     *  获取数组中的对象(可以获取到NULL对象)
     *
     *  @param index 数组下标
     *
     *  @return 对象
     */
    - (id)objectAtWeakMutableArrayIndex:(NSUInteger)index;
    
    @end
    
    //.m文件
    #import "WeakMutableArray.h"
    
    @interface WeakMutableArray ()
    
    @property (nonatomic, strong) NSPointerArray  *pointerArray;
    
    @end
    
    @implementation WeakMutableArray
    
    - (instancetype)init {
        
        self = [super init];
        if (self) {
            [self setup];
        }
        return self;
    }
    
    - (void)setup {
        self.pointerArray = [NSPointerArray weakObjectsPointerArray];
    }
    
    - (void)addObject:(id)object {
        [self.pointerArray addPointer:(__bridge void *)(object)];
    }
    
    - (id)objectAtWeakMutableArrayIndex:(NSUInteger)index {
        return [self.pointerArray pointerAtIndex:index];
    }
    
    #pragma mark - 重写getter方法
    @synthesize allObjects = _allObjects;
    - (NSArray *)allObjects {
        return self.pointerArray.allObjects;
    }
    
    @synthesize usableCount = _usableCount;
    - (NSInteger)usableCount {
        return self.pointerArray.allObjects.count;
    }
    
    @synthesize allCount = _allCount;
    - (NSInteger)allCount {
        return self.pointerArray.count;
    }
    
    @end
    

    NSValue的用处

    遇到一个问题,把 self 加到静态变量的 NSArray 的时候,由于被 NSArray 持有,所以无法释放,因此不能调用 dealloc 方法,也就无法将自己从 array 中 remove 掉。问题整理一下,就是如何在 NSArray 中存放 weak 的引用?
    解决的方案是:在外面加上一层 NSValue。然后把包装好的对象加入数组

    NSValue *value = [NSValue valueWithNonretainedObject:myObj];
    [array addObject:value];
    

    相关文章

      网友评论

        本文标题:iOS-如何在数组中使用弱引用(weak reference)

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