2010-05-19 101 views
5

我对iPhone开发相对较新,所以这可能是我的错,但它违背了我见过的。 :)UIAlertView显示导致内存泄漏

我认为我创建了一个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的保留计数将自己增加5时显示?

感谢您的帮助!

+0

我看到了同样的事情 - 与iOS 4.1的发布版本。该版本似乎并不重要,我尝试了Autorelease - 相同的东西。这肯定是操作系统中的一个bug,对吧? – Axeva 2010-10-08 18:39:18

+0

我今天在iOS 4.1下看到了同样的东西,并且非常感谢您的回答。 – AechoLiu 2010-10-13 07:48:17

+0

但是如何解决这个问题呢? 我处于相同的情况。分配后,retainccount为1; 显示alertView后retaincount是6 后释放它retaincount停留5 - >和内存泄漏发生 – 2011-10-08 12:44:17

回答

6

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

如果您要从UIAlertView的委托例程(例如didPresentAlertView)记录消息,我敢打赌,直到您的功能结束后,才会“发布”警报。发布并不总是意味着释放,它只是放弃所有权。如果没有所有者离开,它只会导致dealloc。

0

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

+0

我倾向于同意,但我只是想知道我是否疯了,或者如果这是出于某种奇怪原因的预期行为。谢谢! – Erik 2010-05-19 02:15:17

3

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