5

我有一些在块内的操作。此操作,仅更新UIImage如下:

^(UIImage *image) {
            self.myImage = image;
        }];

我的图像是通过使用NSURLConnection. 当我从 Internet 收到图像时,我称该块位于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 环境中,所以我无法使用发布或自动发布来抵消。那么有什么解决办法呢?


在此处输入图像描述

4

2 回答 2

6

这是 Apple 框架中众所周知的漏洞。这不是由您使用块引起的。

这是关于它的先前问题和错误报告

于 2012-05-09T16:46:34.653 回答
0

该块保留“自我”,我猜“自我”保留了块(通过“arrayOfBlocks”属性)。如果保留该属性,则您有循环引用和泄漏。我不认为 ARC 处理循环引用,所以你应该在完成后清空块数组(或将属性设置为 nil),并确保没有其他引用块。

于 2012-05-09T11:22:45.270 回答