0

理由はわかりませんが、私のアプリは OALAudioTrack オブジェクトの fadeTo メソッドでクラッシュし続けます。

配列内に 3 つの異なる OALAudioTrack オブジェクトがあり、特定の値が異なる場合にのみ OALAudioTrack オブジェクトを変更する必要があります。値が異なる場合、OALAudioTrack オブジェクトをフェードアウトしてから、新しい OALAudioTrack オブジェクトをフェードインし、配列内の OALAudioTrack オブジェクトを置き換える必要がありますが、最初のフェードアウト (0.0f まで) を実行するとクラッシュし続けるため、これを行うことはできません)。アプリがクラッシュすると、OALActionManager.m の 159 行目 ( NSUInteger index = [targets indexOfObject:action.target]; ) 内にある同じ行で常にクラッシュし、エラーは "Thread 1 EXE_BAD_ACCESS" と表示されます。フェードを行う前に何かしなければならないことはありますか? 1日以上見てきたので、このエラーを乗り越えることができないようです. 私が使用しているコードは以下のとおりです。

if ([[self.soundScapes objectAtIndex:i] isKindOfClass:[OALAudioTrack class]])
{
    [self.tmpSoundScapes removeAllObjects];
    [self.tmpSoundScapes addObject:[fnArr objectAtIndex:i]];
    [self.tmpSoundScapes addObject:[NSNumber numberWithInt:i]];

    OALAudioTrack *currentTrack = [self.soundScapes objectAtIndex:i];

    if ([currentTrack playing])
    {
      NSLog(@"is playing");
      [currentTrack stopFade];

      //This is where the app crashes
      [currentTrack fadeTo:0.0 duration:1.5 target:self selector:@selector(onFadeComplete:)];
    }
}




-(void)onFadeComplete:(id)sender
{
    NSLog(@"fade complete");

    NSString *fn = [self.tmpSoundScapes objectAtIndex:0];
    int i = [[self.tmpSoundScapes objectAtIndex:1] intValue];

    OALAudioTrack *currentTrack = [self.soundScapes objectAtIndex:i];
    [currentTrack stop];
    currentTrack = nil;

    OALAudioTrack* track = [OALAudioTrack track];
    [track preloadFile:fn];
    track.autoPreload = YES;
    track.numberOfLoops = -1;   // Loop forever when playing.            
    track.gain = 0.0f; // volume
    [track play];

    [self.soundScapes replaceObjectAtIndex:i withObject:track];
    [self.soundScapesFiles replaceObjectAtIndex:i withObject:fn];

    int timer;
    if (i==1) 
        timer = 10.0f;
    else if (i==2)
        timer = 25.0f;
    else
        timer = 0.5f;

//    [self performSelector:@selector(onPlayScoundScape:) withObject:[NSNumber numberWithInt:i] afterDelay:timer];
    [track fadeTo:1.0f duration:timer target:self selector:@selector(onPlayScoundScape:)];
}
4

1 に答える 1

1

クラッシュしている部分は「action.target」です。「ターゲット」は弱い参照であるため、アクションが終了する前にトラックの割り当てが解除されると、クラッシュします。

ある時点で、トラックのフェードが完了する前に、コードが他のメソッドで self.soundScapes からトラックを削除しているか、onFadeComplete への別の呼び出しが行われて同じインデックスが生成されていると思われます (したがって、現在フェードしているトラックを削除します)。

于 2012-09-09T10:47:48.517 に答える