【问题标题】:GCD / Blocks without ARC LeakGCD / 没有 ARC 泄漏的块
【发布时间】:2012-10-02 18:39:20
【问题描述】:

我在以下使用 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 是一个自动释放的对象,如上所示。

【问题讨论】:

  • 您使用的是什么版本的 XCode/Instruments?
  • 顺便说一句,这里根本没有理由在newImages 上使用__block__block 仅用于能够分配给块内的变量,或者能够从块内看到以后对外部变量的分配。 newImages 永远不会被分配给除非它被初始化,在块之前。

标签: objective-c ios memory-management objective-c-blocks grand-central-dispatch


【解决方案1】:

newImages 不会自动释放。 new 返回一个拥有引用——它等同于 [[SomeClass alloc] init]

【讨论】:

  • 那么,为什么 Instruments 会标记 [newImages addObject:image];作为泄漏线?
  • 泄漏不是由一行代码“引起”的,它们是由对该对象操作的所有代码的综合影响引起的(特别是,它们是由 absence 释放资源的行,这显然是不可能标记位置的)。 Instruments 会告诉你什么被泄露,分配到哪里,在哪里保留和释放,但是你需要学习如何解释它的信息。
猜你喜欢
  • 2012-05-17
  • 2012-02-25
  • 1970-01-01
  • 2013-01-20
  • 2012-12-09
  • 2012-04-03
  • 1970-01-01
  • 2012-09-14
  • 1970-01-01
相关资源
最近更新 更多