2011-09-20 80 views
1

我創建一個新的UIViewController與下面的代碼的UIViewController保留計數問題

GameViewController *temp = [[GameViewController alloc] initWithNibName:@"GameViewController" bundle:nil]; 
NSLog(@"retain count%d", [temp retainCount]); 
temp.backgroundMusic = backgroundMusic; 
self.gameView = temp; 
[temp release];  
[self presentModalViewController:gameView animated:YES];     
[gameView release]; 

,但是當我看到保留計數,我臨時視圖控制器返回4

這怎麼可能?因爲它是4,所以當我解僱視圖控制器時,我無法將它從內存中移除,並且我的遊戲正在播放。 (我可以看到AI玩的效果)。

+0

[gameView release] should be self.gameView = nil; (具體取決於你是否用保留聲明瞭gameView屬性) –

回答

4

「你永遠不要使用retainCount」。這裏有一個非常好的描述,爲什麼不能: stackoverflow

+0

我得到的是返回的保留計數不正確。那麼你認爲我的問題是什麼?爲什麼在我解僱一個視圖控制器之後,我可以聽到主菜單中角色的動作音樂? –

+0

你應該在'viewWillDisappear'方法中停止你的音樂。不要試圖用'retainCount'方法解決這個問題。 –

+0

它不僅是音樂的東西。我的dealloc方法也不起作用,音樂播放意味着AI功能正在計數工作? –

1

我建議你不要使用retainCount,因爲它通常會給你的對象的實際retaincount提供虛假的信息!

只要按照適當的內存管理做法!這非常簡單,只需遵循NARC原則,只發布包含這些詞的對象:New Alloc Retain Copy。 NARC! :)

我強烈建議你使用儀器的內存泄漏工具,告訴你哪些對象沒有被釋放,哪些對象被釋放,你試圖訪問。

1

在GameViewController你有你的釋放的背景音樂作爲

- (void)viewDidLoad{ 
    //Other nils 
    self.backgroundMusic = nil; 
} 
- (void)dealloc{ 
    //Other releases 
    [backgroundMusic release]; 
    [super dealloc]; 
} 
+0

你忘了'[super dealloc];'.... – bbum

+0

@bbum對不起,我把它留作指示。但是,現在更新了我的答案。 – Saran

6

切勿使用retainCount,它不工作,你覺得它的方式。

如果你需要看到保留,發佈和自動釋放出現一個對象使用儀器:在儀器

運行,在設定「記錄的引用計數」關於分配(你必須停止記錄設置的選項)。導致選擇器運行,停止錄製,在那裏搜索ivar(datePickerView),向下鑽取,您將能夠看到所有保留,發佈和自動釋放發生的位置。

Example screenshot

+1

最後,有人使用分配工具來跟蹤保留計數!謝謝! – bbum