2010-04-17 66 views
0

我有UINavigationController控制幾個視圖。其中一個觀點是由20個可滾動頁面組成。每個頁面都是通過添加按鈕,標籤,UIImageView等等,從UIViews實時構建的。當此UIView彈出堆棧時,內存使用率保持不變。因此,如果我繼續推動/彈出這種觀點,它會不斷上升。內存使用不會丟失 - 沒有泄漏雖然

在我的dealloc,我通過所有20頁遍歷並尋找每個類型的通過得到了增加addSubview對象,然後做,但儀器釋放說我的內存使用量不降!我試圖使用'retainCount'來查看我釋放的對象是什麼,但我可能沒有通過retainCount獲得真實的圖片。對於一些元素retainCount顯示2,所以我試圖釋放該對象兩次,但然後應用程序崩潰。如果我釋放一次它的工作,但內存使用永遠不會下降:(

Q1:我是否需要遍歷查找每個元素,然後對該元素髮布?爲什麼我不能釋放一個父對象和所有對象通過它包含了會得到自動釋放

Q2:是否retainCount的可靠指標

+0

進一步調試。這是我到目前爲止發現的。我有一個UIScrollView,我添加了20個UIViews對象。相同的20個UIViews被添加到NSMutableArray。儀器告訴我,當視圖出現時,20個UIView中的每一個都保持懸掛。好吧,我雖然一定忘了從某個地方'釋放'它,所以保持數量必須增加。我發現確實有一個地方。 那麼就行 [self.scrollView addObject:page]; // page is a UIView I added [page release]; 但是現在釋放NSMutableArray後,當我釋放self.scrollView應用程序崩潰。 – climbon 2010-04-20 04:16:04

+0

NSZombieEnabled後,我看到這個錯誤 *** - [CFString字符串發佈]:消息發送到釋放實例0x3ea6f00 找到NSStackLoggingNoCompact = 1,將有助於以某種方式看到使用「信息的malloc歷史0x3ea6f00與地址在崩潰相關的變量' 這樣做後,我看到一個堆棧跟蹤指向我的目標視圖中的一行,我分配一個NSMutableArray。我將這個數組傳遞給被彈出的視圖。我想可能是我只需要'保留'被傳遞的數組,但沒有幫助。應用程序繼續崩潰並指向同一行。我從來沒有被卡住這麼糟糕:( – climbon 2010-04-20 04:21:18

回答

1

解決的問題。這裏有一些讓我在上週整整困惑的拼圖。

20的UIView對象都是由一個UIScrollView和陣列的NSMutableArray稱作。從一個人發佈他們並沒有完全釋放他們,因爲他們仍然被其他人引用。 確認在將其添加到的UIScrollView後我請每個UIView的釋放,以便保持計數保持1.

每個那些20個UIViews被內部使用來自先前視圖傳遞給它們的陣列 - 通過一個簡單的指針。在使用傳遞數組內的對象之後,我也發佈了它們。因此,固定以上時,我終於來到了釋放整個視圖(通過彈出返回到之前的視圖)保留計數後的應用程序開始像 *消息崩潰 - [CFString字符串發佈]:發送到釋放實例消息0x3ea6f00

跟蹤他們通過NSStackLoggingNoCompact = 1我被告知,周圍的數組我有一些問題,我傳遞給我先前推入堆棧,我剛剛彈出的視圖。但我無法追蹤到哪裏。我曾嘗試增加整個數組的保留,但這並沒有幫助,因爲我沒有對數組內的對象進行保留。

反正終於發現有問題的代碼,其中我被釋放從傳遞陣列對象。我改變它複製數組的內容,現在的應用程序不崩潰,所有視圖正在釋放。唷!

0

你確定你正在尋找的淨字節如果你碰巧看到整個字節,將不會跌?。淨字節是由應用程序分配的字節的當前數目。

當你發佈一個PA租賃對象,它需要釋放它在dealloc中擁有的所有東西:。如果您在那裏釋放主視圖,那麼該視圖將釋放其所有子視圖(如果它被釋放)。

此外,retainCount通常不是一個可靠的指標。由於UIKit和Foundation的基本特性,追查保留計數可能是一項艱鉅的任務。許多蘋果的課程將保留和釋放對象,並且你將無法找到發生的地點和時間。

+0

確實看着淨字節。我按下導航控制器上的視圖後執行發佈。當按下後退按鈕我這樣做 \t [self.navigationController popToViewController:[[self.navigationController可以用popToViewController以某種方式不釋放當前視圖? – climbon 2010-04-17 17:02:03

+0

popToViewController將返回一個被彈出的控制器的數組。嘗試遍歷該數組並循環釋放所有這些視圖控制器。 – rickharrison 2010-04-17 18:54:27

+0

@rickharrison:這樣做是一個/非常壞的主意。最好先做內存管理:c = [[UIController alloc] init ...]; [navController pushViewContro ller:c aanimated:YES]; [c release]; < - 推後 – rpetrich 2010-04-18 07:05:52