UIAlertView - 显示导致内存泄漏

时间:2010-05-19 01:44:48

标签: iphone uialertview retain memory-leaks

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

所以任何人都有任何想法,当调用-show时,本地UIAlertView的保留计数会如何增加5?

感谢您的帮助!

3 个答案:

答案 0 :(得分:6)

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

如果您要记录来自UIAlertView的委托例程的消息,例如didPresentAlertView,我敢打赌,在您“释放”警报之后,直到您的功能结束后才会发生这种情况。发布并不总是意味着解除分配,它只是放弃所有权。如果没有业主离开,它只会导致dealloc。

答案 1 :(得分:3)

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

答案 2 :(得分:0)

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