我在我的应用程序中使用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];
}
你们中有谁知道为什么它会先工作几次然后停止工作?
提前谢谢。
小牛第1
***** 编辑 *****
我刚刚发现,这是在我尝试第二次播放声音时发生的。
难道我忘了在某个地方发布它了吗?
但是我一直认为AudioServicesRemoveSystemSoundCompletion处理内存管理。
*****再一次编辑*****
因此,将其发布在Stackoverflow上使我对问题进行了更深入的思考,并且我现在得到了解决方案(至少我认为我已经解决了;))。
不幸的是,接下来的7.5个小时我无法为自己回答问题,因此我必须编辑问题。
只是为了您更好地了解我的问题。
我正在编写一个内存游戏,每张Card都是一个Class,其中包含其前后图像以及转过时播放的声音。
由于我仅在创建卡时初始化声音,因此不确定每次声音结束时是否应调用AudioServicesRemoveSystemSoundCompletion。
所以我只是在没有AudioServicesRemoveSystemSoundCompletion的情况下尝试了它,现在可以正常工作了。
我现在唯一不确定的是这是否可能导致内存泄漏或类似问题。
但是现在它可以正常工作。
如果有人可以告诉我关于内存使用是否可以,我真的很高兴。 :)
此致。
小牛第1
最佳答案
如果您在应用程序的生命周期内仅创建一次声音(并设置声音完成),那么从内存管理的角度来看应该没问题。它始终是您创建-您释放。
但是,您应该致电
AudioServicesRemoveSystemSoundCompletion(sound);
AudioServicesDisposeSystemSoundID(sound);
当您不再需要声音时(很可能是在创建(或保持引用)声音的对象的dealloc方法中)不要更改这两个声音的顺序,否则会发生内存泄漏。
也许您会发现AppSoundEngine有用。将包装器用于SystemSoundID和关联的C函数很简单。
关于iphone - 几次调用后未调用AudioServicesAddSystemSoundCompletion回调方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6410143/