美文网首页ios专题
NSPointerArray实现数组的弱引用

NSPointerArray实现数组的弱引用

作者: DevWin | 来源:发表于2018-01-11 17:26 被阅读337次
//初始化一个弱引用数组对象
_weakPointerArray = [NSPointerArray weakObjectsPointerArray];
for(int i=0;i<10;i++){
    NSObject *obj = [NSObject new];
    //往数组中添加对象
    [_weakPointerArray addPointer:(__bridge void * _Nullable)(obj)];
}
//输出数组中的所有对象,如果没有对象会输出一个空数组
NSArray *array = [_weakPointerArray allObjects];
NSLog(@"%@",array);
//输出数组中的元素个数,包括NULL
NSLog(@"%zd",_weakPointerArray.count);//此时输出:10,因为NSObject在for循环之后就被释放了
//先数组中添加一个NULL
[_weakPointerArray addPointer:NULL];
NSLog(@"%zd",_weakPointerArray.count);//输出:11
//清空数组中的所有NULL,注意:经过测试如果直接compact是无法清空NULL,需要在compact之前,调用一次[_weakPointerArray addPointer:NULL],才可以清空
[_weakPointerArray compact];
NSLog(@"%zd",_weakPointerArray.count);//输出:0
//注意:如果直接往_weakPointerArray中添加对象,那么addPointer方法执行完毕之后,NSObject会直接被释放掉
[_weakPointerArray addPointer:(__bridge void * _Nullable)([NSObject new])];
NSLog(@"%@",[_weakPointerArray allObjects]);//输出:空数组 NSPointArray[7633:454561] ()
//应该这样添加对象
NSObject *obj = [NSObject new];
[_weakPointerArray addPointer:(__bridge void * _Nullable)obj];
NSLog(@"%@",[_weakPointerArray allObjects]);//输出:NSPointArray[7633:454561] ("<NSObject: 0x6000000078c0>")
/*
 同样的:NSMapTable对应NSDictionary,NSHashTable对应NSSet
 */

我在项目中使用到NSPointerArray的场景:
项目中有个每隔一分钟的计费请求需要发送,我将所有请求返回的NSURLSessionDataTask对象添加到NSPointerArray中,等需要释放的时候遍历NSPointerArray中的所有NSURLSessionDataTask对象,然后执行cancel操作.这样做的好处是,不需要关心NSURLSessionDataTask的生命周期.因为NSPointerArray对NSURLSessionDataTask是weak弱引用,在NSURLSessionDataTask释放的时候,数组中的指针会自动置为null,那么就根据NSPointerArray中的元素指针是否为null来判定NSURLSessionDataTask是否已经执行完毕,没有执行的可以直接调用cancel来取消掉操作.

相关文章

网友评论

  • 小包包包:楼主,我测试跟你那不一样,
    1. MRC 下,在[_weakPointerArray addPointer:NULL];之后,调用 [_weakPointerArray compact];还是有10个元素,所以我这边的表象是 compact 只删除 NULL 对象,并不会清空 _weakPointerArray,你说的是在ARC下

    2. [_weakPointerArray addPointer:(__bridge void * _Nullable)([NSObject new])];
    不管ARC还是MRC,我这边都能成功加入这个元素

本文标题:NSPointerArray实现数组的弱引用

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