【发布时间】:2011-06-20 10:58:12
【问题描述】:
我在我的应用程序中使用 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];
}
你们中有人知道为什么它在前几次有效然后停止工作吗?
提前谢谢。 小牛1st
***** 编辑 ***** 我刚刚发现,当我尝试第二次播放声音时会发生这种情况。 会不会是我忘记在某个地方发布它了? 但我一直认为 AudioServicesRemoveSystemSoundCompletion 处理内存管理。
***** 再编辑一次 ***** 所以在 Stackoverflow 上发布这个让我对这个问题有了更深入的思考,我现在得到了解决方案(至少我认为我明白了;))。 不幸的是,在接下来的 7.5 小时内我无法为自己回答这个问题,所以我必须编辑这个问题。
只是为了让您更好地理解我的问题。
我正在编写一个记忆游戏,每张卡片都是一个类,其中包含它的正面和背面图像以及它转动时播放的声音。 因为我只在创建卡时初始化声音,所以我不确定是否应该在每次声音结束时调用 AudioServicesRemoveSystemSoundCompletion。
所以我只是在没有 AudioServicesRemoveSystemSoundCompletion 的情况下尝试了它,它现在可以工作了。
我现在唯一不确定的是这是否会导致内存泄漏或类似情况。 但目前它工作正常。
如果有人能告诉我这对于内存使用是否可行,我会非常高兴。 :)
最好的问候。 小牛1st
【问题讨论】:
标签: iphone objective-c xcode ipad