我对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?
感谢您的帮助!
答案 0 :(得分:6)
如果您意识到[警报显示]没有立即将警报放在屏幕上,这就有了一些意义。我认为发生的事情是[alert show]将警报添加到系统中保留它的某个队列中。 直到你从这个函数返回并返回事件循环才会显示它。当它最终被解雇时,那些保留计数将会减少,然后它将被释放。
如果您要记录来自UIAlertView的委托例程的消息,例如didPresentAlertView,我敢打赌,在您“释放”警报之后,直到您的功能结束后才会发生这种情况。发布并不总是意味着解除分配,它只是放弃所有权。如果没有业主离开,它只会导致dealloc。
答案 1 :(得分:3)
我非常怀疑这是一次内存泄漏。警报视图刚刚显示:它被添加到窗口等:它们都保留了它们拥有的内容。我打赌你,如果你一旦关闭就检查,它将不复存在。
答案 2 :(得分:0)
我的猜测是这与beta sdk有关。测试版中存在许多错误/错误。我建议用3.1.3或3.2 sdk进行检查。