NSMutableArray内的块泄漏(ARC)
我有一些块内的操作。 这个操作只是像这样更新一个UIImage
:
^(UIImage *image) { self.myImage = image; }];
我的图像是通过NSURLConnection
访问互联网来计算的。 当我从互联网上收到图像时,我会调用NSMutableArray
那个块。 到现在为止还挺好。 我的问题是,当我有多个图像具有相同的URL,而不是进行多个调用,我只是添加一个新的块到处理连接的类内的NSMutableArray
。 这样,我只需要打一个电话,就可以更新多个共享URL的图像。 一切正常,问题是,我正在泄漏块。 我将这样的块添加到NSMutableArray
:
if( (self = [super init]) ) { self.connectionURL=url; self.arrayOfBlocks=[NSMutableArray array]; [arrayOfBlocks addObject:completion]; } return self;
这是连接类被初始化的时候。 这是当我需要添加一个新的块到NSMutableArray
(我只添加它,就是这样):
[arrayOfBlocks addObject:completion];
这是当我最终收到回电,并开始执行块:
for (MyBlock blockToExecute in arrayOfBlocks) { blockToExecute([UIImage imageWithData:data]); }
问题是这个漏水了。 因为我在ARC环境中,所以无法抵消使用版本或自动发布的情况。 那么有什么解决办法?
这是苹果框架中众所周知的漏洞。 这不是由你使用块引起的。
这里有一个关于它的问题和一个错误报告 。
块保留“自我”,我猜“自我”保留块(通过“arrayOfBlocks”属性)。 如果这个财产被保留,你有一个循环引用和泄漏。 我不认为ARC处理循环引用,所以你应该在完成之后清空块数组(或将属性设置为nil),并确保没有其他引用块。