没有ARC泄漏的GCD /块

dar*_*sky 2 memory-management objective-c grand-central-dispatch ios objective-c-blocks

我在以下使用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];
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

根据文书,我在泄漏:[newImages addObject:image];.为什么会泄漏?newImages是一个自动释放的对象,如上所示.

Jos*_*ell 7

newImages没有自动释放.new返回一个拥有的引用 - 它相当于[[SomeClass alloc] init].

  • 泄漏不是由一行代码"引起"的,它们是由对该对象进行操作的所有代码的综合影响引起的(特别是,它们是由释放资源的行的*缺失*引起的) ,这显然不可能标出位置).仪器将告诉您泄漏的内容,分配的位置以及保留和发布的位置,但您需要了解如何解释其信息. (3认同)