里面的NSMutableArray块泄漏(ARC)(Blocks inside NSMutableA

2019-06-24 06:22发布

我有一些操作都在里面块。 此操作,只有更新UIImage是这样的:

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

我的形象是通过与访问互联网计算NSURLConnection 。 当我收到来自因特网上的图像,我称之为块是一个内部NSMutableArray 。 到现在为止还挺好。 我的问题是,当我有相同的网址,多个图像,而不是使多个电话,我刚加入新块的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环境,以抵消使用释放或自动释放。 所以这可能是一个解决方案吗?


Answer 1:

这是苹果公司的框架,一个众所周知的泄漏。 它不是由你使用的块造成的。

下面是前一个问题关于它和bug报告 。



Answer 2:

块保留“自我”,并且我猜测,“自我”保留块(通过“arrayOfBlocks”属性)。 如果该属性被保留,你有一个循环引用和泄漏。 我不认为ARC处理循环引用,所以你应该空框阵列你用它做(或属性设置为无)后,并确保没有其他引用块。



文章来源: Blocks inside NSMutableArray leaking (ARC)