我有一些内部块的操作。此操作仅更新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环境中。那么什么是解决方案?
答案 0 :(得分:6)
这是Apple框架中众所周知的漏洞。这不是因为你使用了积木造成的。
以下是关于它的a previous question和bug report。
答案 1 :(得分:0)
该块保留'self',我猜测'self'保留了块(通过'arrayOfBlocks'属性)。如果保留该属性,则会有循环引用和泄漏。我不认为ARC处理循环引用,所以你应该在完成它之后清空块数组(或者将属性设置为nil),并确保没有其他任何引用这些块。