【问题标题】:Memory leak not detected by static analyzer静态分析器未检测到内存泄漏
【发布时间】:2013-06-24 09:28:27
【问题描述】:

我遇到了这段代码

UIImageView *image = [[UIImageView alloc] initWithFrame:imageFrame];
[image setImage:[UIImage imageNamed:@"myImage"]];
[self.view addSubview:image];
image = nil;

鉴于没有使用 ARC,我假设它会导致 image 对象上的内存泄漏。 然而,静态分析器并没有捕捉到这一点。

我想知道谁错了,是静态分析器还是我,我想对此提出第二意见。

上面的代码真的会泄露吗?

【问题讨论】:

  • 我认为确实如此。您确定分析仪知道缺少 ARC 吗?
  • 是的,因为正确检测到其他泄漏。
  • 我已将您的代码添加到 viewDidAppear,如果我使用 Xcode 4.6.3 分析该代码,则会收到 "Potential leak of an object of an object stored into 'image'" 警告. (我创建了一个没有 ARC 的全新“单一视图应用程序”。)
  • 这段代码在哪里声明,可能在 initWithFrame 中?你使用的是什么 xcode 版本?
  • @H2CO3 结果证明你是对的,我的错。

标签: objective-c memory-management memory-leaks


【解决方案1】:

原来误会的是我(呵呵!)

我正在审核的应用程序非常大,我错过了开发人员在特定类上使用 -fobjc-arc 标志启用 ARC 的事实,包括上述 sn-p 的来源。

静态分析器万岁!

【讨论】:

    【解决方案2】:

    self.view 有一个指向其子视图的指针数组,这将使您的 image 保持可访问性并将引用计数器(用于 ARC)保持在 0 以上。

    CGRect imageFrame = CGRectMake(100, 100, 100, 200);
    UIImageView *image = [[UIImageView alloc] initWithFrame:imageFrame];
    NSLog(@"image=%@", image);
    [image setImage:[UIImage imageNamed:@"Default"]];
    [self.view addSubview:image];
    image = nil;
    
    UIView *v = [[self.view subviews] objectAtIndex:0];
    NSLog(@"v=%@", v);
    

    当您输入self.view = nil; 时,image 的引用计数器将下降并且内存将被释放。我认为您不能以这种方式造成泄漏:)

    【讨论】:

    • 你绝对可以。 image 会下降 1,但在添加到视图时也会上升 1。
    • @user511:这是不正确的。 [self.view addSubview:image]image 的保留计数增加一。 self.view = nil 将再次减少它。但是如果alloc 没有被release 平衡,那么图像对象将永远不会被释放并因此泄漏。 (假设手动引用计数)
    • @user511,这就是重点。但最后我错了,正如我在回答中解释的那样
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-16
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    相关资源
    最近更新 更多