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),并确保没有其他引用块。