1

尝试将对象添加到数组时出现 EXC_BAD_ACCESS 错误。我知道这可能意味着我指向内存中不存在的东西,或者对象包含 nil 值。

代码:

- (void)fadeInPlayer:(AVAudioPlayer *)player withMaxVolume:(float)maxVolume {

NSLog(@"player: %@", player);
NSLog(@"maxVolume: %f", maxVolume);

NSMutableArray *playerAndVolume = [NSMutableArray arrayWithObjects: player, maxVolume, nil];

if (player.volume <= maxVolume) {
    player.volume = player.volume + 0.1;
    NSLog(@"%@ Fading In", player);
    NSLog(@"Volume %f", player.volume);
    [self performSelector:@selector(fadeInPlayer:withMaxVolume:) withObject:playerAndVolume afterDelay:0.5];
    //playerAndVolume array used here because performSelector can only accept one argument with a delay and I am using two...
    }

}

奇怪的是,当我打印要添加到控制台的对象时(如上面的 NSLogs 所示),它们返回数据:

player: <AVAudioPlayer: 0x913f030>
maxVolume: 0.900000

该应用程序在 NSLogs 之后立即崩溃。其余代码在没有数组的情况下工作正常,但我需要使用它来调用方法上的 performselector:withObject:AfterDelay。

因此,我如何初始化数组或对象类型肯定有问题,但我无法弄清楚。

任何帮助表示赞赏。

4

1 回答 1

4

您不能将 a 添加floatNSArray. 您必须将其包装在NSNumber.

真正的问题是传入的第一个参数是NSArray您创建的,传递给您的函数的第二个参数是NSTimer支持performSelector:afterDelay:...方法的。它不会分散数组中的对象,它只是将数组作为第一个参数传递。如果您坚持使用这种API设计,那么您需要测试第一个参数的类以查看它是 anNSArray还是 an AVAudioPlayer。你可以像这样实现这个函数:

-(void)fadeInPlayer:(AVAudioPlayer *)player withMaxVolume:(NSNumber *)maxVolume {
    if ([player isKindOfClass:[NSArray class]]){
        // This is a redundant self call, and the player and max volume are in the array.
        // So let's unpack them.
        NSArray *context = (NSArray *)player;
        player = [context objectAtIndex:0];
        maxVolume = [context objectAtIndex:1];
    } 

    NSLog(@"fading in player:%@ at volume:%f to volume:%f",player,player.volume,maxVolume.floatValue);

    if (maxVolume.floatValue == player.volume || maxVolume.floatValue > 1.0) return;

    float newVolume =  player.volume + 0.1;
    if (newVolume > 1.0) newVolume = 1.0;
    player.volume = newVolume;

    if (newVolume < maxVolume.floatValue){
        NSArray *playerAndVolume = [NSArray arrayWithObjects: player, maxVolume, nil];
        [self performSelector:@selector(fadeInPlayer:withMaxVolume:) withObject:playerAndVolume afterDelay:0.5];
    }
}

您将使用它,将 包装在floatNSNumber,如下所示:

[self fadeInPlayer:player withMaxVolume:[NSNumber numberWithFloat:1.0]];

请注意,这将被认为是一个非常奇怪的函数,但此代码确实可以运行。

于 2012-12-31T01:17:41.050 回答