Objective c GCD/无电弧泄漏的块

Objective c GCD/无电弧泄漏的块,objective-c,ios,memory-management,objective-c-blocks,grand-central-dispatch,Objective C,Ios,Memory Management,Objective C Blocks,Grand Central Dispatch,我在下面使用GCD的代码中有一个漏洞。注意:我没有使用ARC。泄漏正是在 __block NSMutableArray *newImages = [NSMutableArray new]; dispatch_async(serialQueue, ^{ for (NSDictionary *imageData in results) { NSURL *url = [NSURL URLWithString:[imageData objectForKey:@"url"]]

我在下面使用GCD的代码中有一个漏洞。注意:我没有使用ARC。泄漏正是在

__block NSMutableArray *newImages = [NSMutableArray new];

dispatch_async(serialQueue, ^{

    for (NSDictionary *imageData in results) {

        NSURL *url = [NSURL URLWithString:[imageData objectForKey:@"url"]];
        NSURLRequest *request = [NSURLRequest requestWithURL:url];

        NSError *error = nil;
        NSHTTPURLResponse *response = nil;
        NSData *imageData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

        if (error == nil && imageData != nil && response.statusCode == 200) {
            UIImage *image = [UIImage imageWithData:imageData];
            [newImages addObject:image];
        }

        else {
            self.errorLabel.text = @"An error has occured downloading some images.";
            [self.spinner stopAnimating];
        }
    }
});

根据仪器,我在以下位置泄漏:
[newImages addObject:image]。为什么会漏水
newImages
是如上所示的自动删除对象。

newImages
不是自动删除的。返回一个拥有的引用——它相当于
[[SomeClass alloc]init]

那么,为什么仪器要标记[newImages addObject:image];作为泄漏的行?泄漏不是由一行代码“引起”的,它们是由在该对象上运行的所有代码的综合影响引起的(特别是,它们是由没有释放资源的行引起的,这显然不可能标记资源的位置)。Instruments会告诉您泄漏的内容、分配的位置以及保留和发布的位置,但您需要了解如何解释其信息。您使用的是什么版本的XCode/Instruments?顺便说一句,这里根本没有理由在
newImages
上使用
\u block
<代码>\u块
仅在能够分配给块内的变量,或能够从块内看到外部变量的后续分配时才有用<代码>新图像永远不会指定给,除非在块之前对其进行初始化。