2

私は avadioplayer を使用するのが初めてで、サウンドを再生するたびに記憶があるようです。Instrument内でそれを取り除くために何が欠けているのかわかりません。これは偽陽性でしょうか?

ViewController.h :

@interface ISpectatorViewController : UIViewController <UIAccelerometerDelegate>{

AVAudioPlayer *massCheerSoundID;

}

@property(nonatomic,retain) AVAudioPlayer * massCheerSoundID;

// ViewController.m

- (void)viewDidLoad {

    NSString * filePath;

    filePath = [[NSBundle mainBundle] pathForResource:@"massCheer" ofType:@"mp3"];

    massCheerSoundID = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:filePath ]error:nil];

}

- (void) playSound
{

        if(massCheerSoundID.playing == false)
    {

        massCheerSoundID.currentTime = 0.0;


                //leak here
        [massCheerSoundID play];
    }
}

- (void)dealloc {

    [super dealloc];
    [massCheerSoundID release];

}

私は問題が何であるかを知りました。

代わりに UIAccelerometerDelegate を設定したので、インターフェイスに AVAudioPlayerDelegate を追加する必要があります

@interface iSpectatorViewController: UIViewController<AVAudioPlayerDelegate>

を設定します。

massCheerSoundId.delegate = self
4

5 に答える 5

3

コードを変更せずに、MediaPlayer.framework をプロジェクトに追加してみてください

于 2009-11-25T11:52:06.500 に答える
2

今日も同じ漏れを発見。MediaPlayer.framework を追加すると、それが修正されるようです。

于 2010-01-03T00:24:10.983 に答える
1

それはあなたのdealloc方法でしょうか?

release慣習は、最初に呼び出してから呼び出すことだと思います[super dealloc]

これは「最初に自分のものをリリースしてから、親クラスに処理させる」ことを意味しているといつも思っていました。

メソッドdeallocは次のようになります。

- (void)dealloc {

    [massCheerSoundID release];
    [super dealloc];

}
于 2009-09-15T21:46:32.930 に答える
1

今日も同じ漏れを発見。MediaPlayer.framework を追加すると、それが修正されるようです。

それは私にとってもうまくいきました。変。

于 2011-03-03T01:45:21.777 に答える
0

問題は、ビューを解放していない場合、massCheerSoundId を何度も再起動している可能性があります。したがって、サブビューを追加している場合、viewDidLoad が呼び出され、プレーヤーを初期化すると、ビューを解放しなかったため (コピーが 1 つしかないと仮定して)、サブビューを削除して再度追加している可能性があります。 dealloc は呼び出されません (とにかくそうは思いません)、ビューを再度追加すると、massCheerSoundId がオーバーライドされてリークします..、別の問題として、プロパティとして massCheerSoundId があるため、それを割り当て、生成されたセッターもそれを保持する可能性があります。 +1だけであるべきときに+2の参照カウントが残っています...私の仮定が正しいと仮定すると、このようにviewDidLoadを書くことをお勧めします

    - (void)viewDidLoad {    
    NSString * filePath;   
     filePath = [[NSBundle mainBundle] pathForResource:@"massCheer" ofType:@"mp3"]; 
    if(massCharSoundId!=nil)
{
       AVAudioPlayer *p= [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURLfileURLWithPath:filePath ]error:nil];}
       massCheerSoundID = p;
     [p release];
}
于 2009-09-15T20:22:49.617 に答える