Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/109.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
错误24(打开的文件太多)-iPhone_Iphone_Ios_Avfoundation_Avaudioplayer - Fatal编程技术网

错误24(打开的文件太多)-iPhone

错误24(打开的文件太多)-iPhone,iphone,ios,avfoundation,avaudioplayer,Iphone,Ios,Avfoundation,Avaudioplayer,我最近在我的游戏中实现了声音。每次用户触摸屏幕时,都会射出一个箭头,并播放一个声音。我正在使用以下代码播放声音: - (void)arrowShoot { NSURL *url = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/arrow.mp3", [[NSBundle mainBundle] resourcePath]]]; arrowShootPlayer = [[AVAudioPlayer alloc] in

我最近在我的游戏中实现了声音。每次用户触摸屏幕时,都会射出一个箭头,并播放一个声音。我正在使用以下代码播放声音:

- (void)arrowShoot {
    NSURL *url = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/arrow.mp3", [[NSBundle mainBundle] resourcePath]]];
    arrowShootPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];
    if (arrowShootPlayer != nil) {
        [arrowShootPlayer play];
    }
}
我每次都给
arrowShootPlayer
分配内存的原因是用户可以快速点击屏幕,我希望声音重叠。否则,仅在前一个声音播放完毕后播放该声音

无论如何,我得到了这个错误:

<com.apple.main-thread> shm_open failed: "AppleAudioQueue.36.5755" (23) flags=0x2 errno=24
shm_打开失败:“AppleAudioQueue.36.5755”(23)标志=0x2错误号=24 一旦我出现这个错误,声音就停止播放。其他一切都很好,只是箭的声音停止了播放

有没有更好的办法在iPhone上播放类似这样的“重叠”声音,或者有没有办法避免这个错误


谢谢

如果始终是相同的音频,请使用从内存缓冲区播放,而不是打开文件。声明一些本地缓冲区:

NSData* data;
然后在您的方法中:

if(!data) {
   data = [NSData dataWithContentsOfURL:url options:NSDataReadingMappedIfSafe error:&err];
}
arrowShootPlayer = [[AVAudioPlayer alloc] initWithData:data error:nil];
if (arrowShootPlayer) {
    [arrowShootPlayer play];
}

也许您需要在文件停止播放后手动关闭(或重新使用)该文件?另一个家伙不知道
stringByAppendingPathComponent:
,而是使用错误和多余的格式化方法…不过,您正在泄漏内存。你必须确保在某处释放AVAudioPlayers。最简单的方法是使用ARC;)我总是使用ARC,所以如果有人不这样做,我就让他来处理。:)我有一个要求,将刷新0.000011秒的Api数据,我已经设置了定时器。所以我犯了这个错误(太吝啬了打开文件),现在我该怎么办?@iosdeveloper,实现一个队列。使用这种刷新率,您将没有时间完成线程,因此它会重叠并阻止文件关闭。您能给我举个例子吗?