问题描述
我有一些在块内的操作.此操作仅更新如下所示:
^(UIImage *image) { self.myImage = image; }];
我的图像是通过使用NSURLConnection访问Internet来计算的.当我从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]); }
问题是,这是以某种方式泄漏.我无法使用版本或自动发布来抵消,因为我正在进行弧环境.那么解决方案是什么?
推荐答案
这是Apple框架中的众所周知的泄漏.它不是由您使用块引起的.
这里是上一个问题关于它和<一个href ="http://openradar.appspot.com/11081198"rel ="nofollow noreferrer"> bug报告.
其他推荐答案
块保留"self",我猜测"self"保留块(通过'arrayofblocks'属性).如果保留该属性,则您有一个循环参考和泄漏.我不认为arc掌握循环引用,所以你应该在完成它后清空块数组(或将属性设置为NIL),并确保没有其他引用块.