2013-07-12 38 views
1

不釋放存儲器I創建一個單用包含AVAudioPlayer對象AVAudioPlayer與ARC

#import <Foundation/Foundation.h> 
#import <AVFoundation/AVFoundation.h> 

@interface drwAudioPlayer : NSObject <AVAudioPlayerDelegate> 

@property AVAudioPlayer *aPlayer; 

+(drwAudioPlayer *) sharedPlayer { 

    static drwAudioPlayer *sharedPlayer = nil; 
    if (!sharedPlayer) { 
     sharedPlayer = [[super allocWithZone:nil] init]; 
    } 
    return sharedPlayer; 
} 

-(void) setPlayerEpisode:(NSData *) episodeFile { 
    NSError *error; 
    aPlayer = nil; 
    aPlayer = [[AVAudioPlayer alloc] initWithData:episodeFile error:&error]; 
} 

以我主視圖我包括上面的類和創建的類型drwAudioPlayer的對象。當我撥打[drwAudioPlayer.aPlayer setPlayerEpisode:foo]時,我看到新文件正在加載,而舊文件已經發布。

但是,只要我開始播放文件,然後嘗試呼叫[drwAudioPlayer.aPlayer setPlayerEpisode:foo2],內存就會增加新文件的大小。

在加載新文件播放之前,我必須做些什麼來基本釋放內存。

我正在使用ARC。

+0

嘗試self.aPlayer =零替代,或者用_aPlayer =零,因爲你不合成 –

+0

我的不好,我正在用我的代碼合成aPlayer。只是複製它錯了。但我試過self.aPlayer,但結果是一樣的。只要我開始播放,aPlayer就不會被釋放。 – Peter

回答

-2

根據定義,單例是內存泄漏。不要使用它們。相反,在你的代碼中對音頻播放器進行引用,當你使用播放器的視圖控制器消失時,播放器將被釋放。在iOS下,內存不是垃圾收集,你根本無法做到這樣的事情,並期望內存被釋放,ARC不是垃圾收集器。

+0

我使用單例,因爲我只想要drwPlayer類的實例,它應該管理應用程序中所有聲音的播放,並且還負責保存播放位置。主視圖是桌面視圖。每個單元格後面都有一個detailview,它有自己的文件可以播放。所以當我切換視圖時,我不會知道一個文件是否仍在播放,然後停止播放,然後從顯示的實際視圖播放文件。這是單身人士的原因。 – Peter

+0

是的,我知道你認爲單身是一種好方法。不是這樣。如果問題是從一個視圖控制器訪問到另一個視圖控制器,那麼您可以隨時掛起AppDelegate類的屬性ref。這樣,你可以設置appDelegate.playerRef = nil,普通屬性邏輯將處理內存管理。你正在做的是創建一個全局變量(一個模塊中的靜態引用),然後將其設置爲一個對象,這會使ARC失敗並使代碼泄漏內存。 – MoDJ

+0

我想我明白你的觀點。但是我不理解的是,爲什麼一開始播放文件時內存使用量就會增加。 – Peter

0

它似乎是iOS6和模擬器的問題。到目前爲止,我只在模擬器中測試了我的應用程序泄漏內存,而不是在實際設備上。在iPhone上運行代碼時,一切都像魅力一樣,而且我的代碼中沒有泄漏內存。

我還發現在計算器這些職位被說同樣的事情:

Memory Leak AVAudioPlayer

Memory Leak iOS6