NSMutableArray漏洞内的块(ARC)

时间:2012-05-09 08:54:12

标签: ios nsurlconnection automatic-ref-counting objective-c-blocks

我有一些内部块的操作。此操作仅更新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环境中。那么什么是解决方案?


enter image description here

2 个答案:

答案 0 :(得分:6)

这是Apple框架中众所周知的漏洞。这不是因为你使用了积木造成的。

以下是关于它的a previous questionbug report

答案 1 :(得分:0)

该块保留'self',我猜测'self'保留了块(通过'arrayOfBlocks'属性)。如果保留该属性,则会有循环引用和泄漏。我不认为ARC处理循环引用,所以你应该在完成它之后清空块数组(或者将属性设置为nil),并确保没有其他任何引用这些块。