5

我对 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?

谢谢你的帮助!

4

3 回答 3

6

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

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

于 2010-05-19T05:18:22.757 回答
3

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

于 2010-05-19T01:52:51.880 回答
0

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

于 2010-05-19T01:50:15.333 回答