2010-10-11 70 views
1

請看看我的代碼下面。這部分從堆棧中彈出頂視圖控制器(通常是相同的ArticleControllerController)(無論是否彈出單個控制器或彈出到根控制器,我發現問題都保持不變),創建新控制器並添加到堆棧。UIViewController保留問題:計數從未達到零

問題是,它的保留計數永遠不會爲零,所以方法ArticleControllerController永遠不會被稱爲留下大量的各種接口對象未發佈。由於內存不足,最終應用程序崩潰(至少在設備中,至少我認爲這部分是主要問題)。

- (void) navigateToNewsCategoryByIndex:(int)idx { 
    [app.nav popViewControllerAnimated:NO]; // could be popToRootController 
    ArticleControllerController *ac = [[ArticleControllerController alloc] init]; 
    ac.categoryIndex = idx; 
    [app.nav pushViewController:ac animated:NO]; 
    [ac release]; 
    NSLog(@"AC retain count: %d", [ac retainCount]); // prints 2 
} 

所以,我猜,popViewControllerAnimated只會釋放其餘兩個保留中的一個。爲什麼?我應該尋找什麼?我能做什麼?撥打[ac release]兩次(那將是可怕的事情)?

+0

檢查您的控制器是否被某個其他類保留 - 可能是代表某事。 – Vladimir 2010-10-11 11:31:00

+0

對不起吃午飯,但你似乎已經修好了:) – willcodejavaforfood 2010-10-11 11:45:47

+0

是的,那完全是我的錯誤。天哪,我現在感覺超級笨拙,因爲我花費了令人難以置信的時間尋找這個問題的根源。 – sniurkst 2010-10-11 11:48:00

回答

1

您如何知道導航控制器的保留數2不正確?

因爲我們不知道UIKit的內部工作方式,所以不能依賴retainCount來執行alloc/release調試。只要您在代碼中保留並正確釋放,您就可以99.9%確定UIKit也能正常工作。

我猜popViewController會刪除pushViewController添加的所有保留 - 即使我不知道會有多少 - 但它可能會將其設置爲autoreleased,因此您不能保證它會被釋放在調用popViewController之後立即進行。

我會假設UIKit導航控制器沒有錯誤(否則許多其他開發人員會抱怨它),並且在代碼中的某處您將它保留在其他位置(可能沒有意識到它,即代表財產宣佈保留,而不是分配等)

希望幫助!

+1

保留代表正是我的問題。在我發佈我的問題後,我決定添加自己的保留/釋放方法並在其中打印retainCounts,所以在他們顯示更瘋狂的數字並「保留」一段時間後加起來之後,我發現這是因爲愚蠢的我以某種方式添加保留而是分配給委託屬性。該死的,現在我想切我的手指黑幫風格... – sniurkst 2010-10-11 11:47:06

+0

我們都做到了:) – deanWombourne 2010-10-11 11:53:06

+0

啊,不幸的是,我仍然得到記憶警告和崩潰,直到沒有明白的想法爲什麼...好吧,至少那個代表部分現在是固定的。 (編輯:哈,看起來像我做到了 - 仍然有希望!) – sniurkst 2010-10-11 11:54:14