【问题标题】:UIAlertView -show causing a memory leakUIAlertView -show 导致内存泄漏
【发布时间】:2011-02-21 04:25:16
【问题描述】:

我对 iPhone 开发比较陌生,所以这可能是我的错,但这与我所看到的背道而驰。 :)

我认为我正在创建一个 UIAlertView,它恰好存在于“if”语句的这个真空中。

NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

if(!data)
{
    // Add an alert
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error"
                                                    message:@"Unable to contact server"
                                                   delegate:nil
                                          cancelButtonTitle:@"Ok"
                                          otherButtonTitles:nil];
    NSLog(@"retain count before show: %i", alert.retainCount);
    [alert show];
    NSLog(@"retain count before release: %i", alert.retainCount);
    [alert release];
    NSLog(@"retain count after release: %i", alert.retainCount);
    return nil;
}

但是,控制台日志让我感到困惑。

retain count before show: 1
retain count before release: 6
retain count after release: 5

我也尝试过添加:

alert = nil;

发布后。这使得保留计数为 0,但我仍然显示泄漏。如果有帮助,泄漏的责任框架是 UIKeyboardInputManagerClassForInputMode。我也在使用 OS 4 Beta 3。

所以有人知道本地 UIAlertView 的保留计数如何在调用 -show 时将自身增加 5 吗?

感谢您的帮助!

【问题讨论】:

  • 我看到了同样的事情——iOS 4.1 的发布版本。发布似乎无关紧要,我尝试了 Autorelease——同样的事情。这一定是操作系统的错误吧?
  • 我今天在 iOS 4.1 下也看到了同样的情况,感谢您提出这个问题。
  • 但是如何解决这个问题呢?我也有同样的情况。分配后retainccount为1;显示 alertView 后,retaincount 为 6 释放后,retaincount 保持 5 -> 并发生内存泄漏
  • mock p:完全没有问题。只是,随着发布,您删除了您的保留。在所有其他窗口和控制器删除它们的保留后,alertView 对象将被杀死。如果您不释放它,则在所有其他人释放该对象后,保留计数将保持为 1,您将有泄漏。

标签: iphone uialertview retain memory-leaks


【解决方案1】:

如果您意识到 [alert show] 不会立即将警报显示在屏幕上,这是有道理的。我认为发生的事情是 [alert show] 将警报添加到系统中某个保留它的队列中。 在你从这个函数返回并返回事件循环之前,它实际上不会显示。当它最终被解除时,这些保留计数将减少,然后将被释放。

如果您要从 UIAlertView 的委托例程(例如 didPresentAlertView)记录消息,我敢打赌,在您“释放”警报之后,您的函数结束后才会发生这种情况。释放并不总是意味着解除分配,它只是放弃所有权。只有在没有所有者的情况下才会导致释放。

【讨论】:

    【解决方案2】:

    我非常怀疑这是内存泄漏。警报视图刚刚显示:它被添加到窗口等:它们都保留了它们所拥有的。我敢打赌,如果你在它关闭后检查它,它就不会再存在了。

    【讨论】:

      【解决方案3】:

      我的猜测是这与 beta sdk 有关。测试版中有许多错误/错误。我建议使用 3.1.3 或 3.2 sdk 进行检查。

      【讨论】:

      • 我倾向于同意,但我只是想知道我是疯了还是出于某种奇怪的原因这是故意的行为。谢谢!
      猜你喜欢
      • 2017-10-03
      • 2015-07-06
      • 2014-06-07
      • 2013-11-20
      • 2011-10-28
      • 2016-01-18
      • 2012-12-13
      • 1970-01-01
      • 2011-01-08
      相关资源
      最近更新 更多