2010-04-19 33 views
0

我接手有細微瑕疵代碼庫 - 音頻播放器變爲靜音,未註冊的崩潰,行爲古怪等如何轉換代碼正常釋放內存

我找到了一種方法挑起的一個實例這個問題並追蹤到這個代碼片段:

- (void)playNextArrayObject { 

NSURL *soundURL = [NSURL fileURLWithPath:[[NSBundle mainBundle] 
    pathForResource:[[soundsToPlay objectAtIndex:count] description] 
    ofType:@"mp3"]]; 
self.audioPlayer = nil; 

self.audioPlayer = [[AVAudioPlayer alloc] 
    initWithContentsOfURL:soundURL error:nil]; 

self.audioPlayer.delegate = self; 
AudioSessionSetActive(YES); 
[audioPlayer play]; 
} 

當我註釋掉二號線(零),並添加釋放到了最後,這個問題將停止。

[self.audioPlayer release]; 
  1. 我在哪裏何去何從?
  2. Nils在整個代碼中都以類似的方式使用(並可能導致類似的問題) - 是否有一種安全的方法來刪除它們?
  3. 我是新來的內存管理 - 我怎麼才能從糟糕的零使用中辨別正確的零用法?

回答

1

你的改變是正確的 - = nil行是noop,並且在alloc/init之後釋放是必要的。使用self.something = nil可能是一個好習慣;它釋放一個屬性的當前值,並確保你不能無效訪問釋放的內存。

良好的內存管理很簡單。但你應該閱讀Cocoa內存管理指南以獲得明確的指示。

+0

該= nil不釋放(我想它可能)。我試過它來代替發行版,但碰到了這個bug。 – BankStrong 2010-04-19 12:59:02

+0

它確實 - 它釋放屬性的前一個值,這就是爲什麼它是多餘的,因爲下一行的賦值完全相同(以及進行賦值)。如果該屬性在別處被引用,則替換最終(缺失)版本可能會導致其他問題。 – 2010-04-19 13:12:38

+0

現在有道理 - 謝謝你的解釋。 – BankStrong 2010-04-19 13:19:43