0

数分前にもっと長い質問を投稿しましたが、通常は投稿するとすぐに何が起こっているのかを理解したので、ほとんどの投稿が無関係だったので削除しました。その後、Google に戻りました。

この投稿で説明されているのとほぼ同じ問題があり、6月から回答がありません。http://www.iphonedevsdk.com/forum/iphone-sdk-development/20975-avaudioplayer-nsurl-memory-management.html

要約すると、私は AVAudioPlayer を使用しており、それを audioPlayerDidFinishPlaying:successfully: デリゲート メソッドでリリースしています。プレーヤーを初期化した後、関連付けられている NSURL オブジェクトを解放する必要があります。そうしないと、リークが発生します。しかし、プレーヤーを初期化した後に解放すると、既に解放されているためクラッシュします。奇妙なことに、最初は常にクラッシュするとは限らず、ほとんどの場合、2 番目のサウンドが再生された後にクラッシュします。ときどき (めったに) クラッシュする前に、少数またはプレーヤーを割り当て/解放することができます (私は解放後にポインターを再利用します)。何か助けはありますか?

コード スニペット: (soundKeyUp は AVAudioPlayer* クラス変数であるため、ここでは宣言しません)

NSString *soundKeyUpPath = [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"soundKeyUp%d", key.tag % 5] ofType:@"wav"];
    NSURL *soundKeyUpURL = [[NSURL alloc] initFileURLWithPath:soundKeyUpPath];
    soundKeyUp = [[AVAudioPlayer alloc] initWithContentsOfURL:soundKeyUpURL error:nil];
    if(soundKeyUp) {
        [soundKeyUp setDelegate:self];
        [soundKeyUp play];
    }
    else {
        [soundKeyUp release];
        soundKeyUp = nil;
    }

    [soundKeyUpPath release];
    [soundKeyUpURL release];

Steve Riggins への返信: 前述のように、毎回同時にクラッシュしないというのが秘訣です。ほとんどの場合、最初は適切にリリースされます (または、少なくともクラッシュやリークは発生しません) が、通常、2 回目にプレーヤーと URL を割り当て/解放した後、URL を解放するとクラッシュします。クラッシュするまでに 3 回、4 回、5 回以上かかることもありますが、常にクラッシュします。

4

2 に答える 2

1

プレーヤーを作成するときに URL を解放します。私は自分のアプリでこれを行い、正常に機能します。漏れ、クラッシュなどはありません

AVAudioPlayer *newPlayer =
        [[AVAudioPlayer alloc] initWithContentsOfURL: fileURL
                                               error: nil];
        [fileURL release];

また、他のオブジェクトに含まれているオブジェクトを決して解放しないでください。それは彼らの仕事であって、あなたの仕事ではありません。

編集: URL がまだリークしている場合は、作成時に何をしているのかを確認する必要があります。次のようになります。

NSURL *fileURL = [[NSURL alloc] initFileURLWithPath: [self path]];

Cocoa の所有権の規則に従い、alloc メソッドを使用することは、それを所有していることを意味するため、解放します。

于 2010-02-04T23:15:25.437 に答える
0
 - (IBAction) playaction {

        NSString *soundFilePath = [[NSBundle mainBundle] pathForResource:@"songname" ofType:@"mp3"];
        NSURL *newURL = [[NSURL alloc] initFileURLWithPath: soundFilePath];
        self.soundFileURL = newURL;
        [newURL release];
        [[AVAudioSession sharedInstance] setDelegate: self];
        [[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryAmbient error: nil];

    // Registers the audio route change listener callback function
    AudioSessionAddPropertyListener (
                                     kAudioSessionProperty_AudioRouteChange,
                                     audioRouteChangeListenerCallback,
                                     self
                                     );

    // Activates the audio session.

    NSError *activationError = nil;
    [[AVAudioSession sharedInstance] setActive: YES error: &activationError];

    AVAudioPlayer *newPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL: soundFileURL error: nil];
    self.appSoundPlayer = newPlayer;
    [newPlayer release];
    [appSoundPlayer prepareToPlay];
    [appSoundPlayer setVolume: 1.0];
    [appSoundPlayer setDelegate: self];
    [appSoundPlayer play];

}

これに似たものを使用する必要があります。ここで appSoundPlayer はヘッダー ファイルで次のように宣言されています。

AVAudioPlayer *appSoundPlayer;

また、それにプロパティを設定し、

@property(nonatomic, retain)AVAudioPlayer *appSoundPlayer;

dealloc メソッドで解放します。これは私がフォローしている方法であり、メモリ リークは見られませんでした。

于 2010-02-05T02:51:28.407 に答える