2010-05-19 73 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

我非常懷疑這是內存泄漏。警報視圖正在顯示:它正在被添加到窗口中,等等:它們都保留了它們所擁有的內容。我敢打賭,如果你一旦查封了它,它就不會再存在了。