NSPointerArray实现数组的弱引用

//初始化一个弱引用数组对象
_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] ("")
/*
 同样的:NSMapTable对应NSDictionary,NSHashTable对应NSSet
 */

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

你可能感兴趣的:(NSPointerArray实现数组的弱引用)