我在我的应用程序中使用AudioServicesAddSystemSoundCompletion来检测声音何时完成,然后触发其他一些操作。 出于某种原因,我得到以下行为,它适用于前8到12个声音(这至少是我测试的),然后不再调用为AudioServicesAddSystemSoundCompletion定义的回调。
这是我创建声音的代码:
NSString *soundPath = [[NSBundle mainBundle] pathForResource:[[soundFileName componentsSeparatedByString:@"."]objectAtIndex:0]ofType:@"wav"];
Log2(@"soundFileName: %@", soundFileName);
CFURLRef soundURL = (CFURLRef)[NSURL fileURLWithPath:soundPath];
AudioServicesCreateSystemSoundID(soundURL, &sound);
AudioServicesAddSystemSoundCompletion(sound, nil, nil, playSoundFinished, (void*) self);
播放声音:
AudioServicesPlaySystemSound(sound);
并在声音结束时做一些事情:
void playSoundFinished (SystemSoundID sound, void *data) {
pf //Typedef for PRETTY_FUNCTION log
AudioServicesRemoveSystemSoundCompletion(sound);
[AppState sharedInstance].b_touchesFREE = TRUE;
if([[AppState sharedInstance].ma_cardsToCheck count] >= 2)
{
[[AppState sharedInstance].vc_spiel pairFound];
}
if (((Card*)data).b_isTurnedFaceUp) {
[AppState sharedInstance].i_cardsTurnedFaceUp --;
}
[(Card*)data release];
}
有没有人知道为什么它在前几次有效,然后停止工作?
提前谢谢。 Maverick1st*****编辑***** 我刚刚发现,当我尝试第二次播放声音时会发生这种情况。 可能是,我忘了把它放到某处? 但我一直认为AudioServicesRemoveSystemSoundCompletion处理内存管理。
*****再一次编辑***** 所以在Stackoverflow上发布这个让我对这个问题有了更深入的思考,我现在得到了解决方案(至少我认为我得到了它;))。 不幸的是,我无法在接下来的7.5小时内为自己回答这个问题,所以我必须编辑这个问题。
只是为了让你更好地理解我的问题。
我正在编写一个记忆游戏,每张卡片都是一个包含正面和背面图像的类,以及它转身时播放的声音。 因为我只是在创建卡片时初始化声音,所以我不确定每次声音结束时是否应该调用AudioServicesRemoveSystemSoundCompletion。
所以我只是在没有AudioServicesRemoveSystemSoundCompletion的情况下尝试过它现在可以正常工作。
我现在唯一不确定的是,这是否会导致内存泄漏或类似的事情。 但是现在它工作正常。
如果有人能告诉我这对于内存的使用情况是否合适我会真的发生。 :)
祝你好运。 Maverick1st
答案 0 :(得分:5)
如果您在应用程序的生命周期内只创建一次声音(并设置声音完成),那么从内存管理的角度来看应该没问题。它始终是你创造的 - 你释放。
但是,你应该致电
AudioServicesRemoveSystemSoundCompletion(sound);
AudioServicesDisposeSystemSoundID(sound);
当你不再需要声音时(最可能在你创建(或保持引用)声音的对象的dealloc方法中。不要改变这两个的顺序,否则你会有内存泄漏。
也许你会发现AppSoundEngine有用。使用SystemSoundID和相关C函数的包装器很简单。