Mav*_*1st 4 iphone xcode objective-c ipad
我在我的应用程序中使用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);
Run Code Online (Sandbox Code Playgroud)
播放声音:
AudioServicesPlaySystemSound(sound);
Run Code Online (Sandbox Code Playgroud)
并在声音结束时做一些事情:
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];
}
Run Code Online (Sandbox Code Playgroud)
有没有人知道为什么它最初几次工作然后停止工作?
Thx提前.Maverick1st
*****编辑*****我刚刚发现,当我尝试第二次播放声音时会发生这种情况.可能是,我忘了把它放到某处?但我一直认为AudioServicesRemoveSystemSoundCompletion处理内存管理.
*****再一次编辑*****所以在Stackoverflow上发布这个让我对这个问题有了更深入的思考,我现在得到了解决方案(至少我认为我得到了它;)).不幸的是,我无法在接下来的7.5小时内为自己回答这个问题,所以我必须编辑这个问题.
只是为了让你更好地理解我的问题.
我正在编写一个记忆游戏,每张卡片都是一个包含正面和背面图像的类,以及它转身时播放的声音.因为我只是在创建卡片时初始化声音,我不确定每次声音结束时是否应该调用AudioServicesRemoveSystemSoundCompletion.
所以我只是在没有AudioServicesRemoveSystemSoundCompletion的情况下尝试过它现在可以正常工作了.
我现在唯一不确定的是,这是否会导致内存泄漏或类似的事情.但是现在它工作正常.
如果有人可以告诉我,如果内存使用情况确实如此,我会真的发生.:)
最好的祝福.Maverick1st
如果您在应用程序的生命周期内仅创建一次声音(并设置声音完成),那么从内存管理的角度来看应该没问题.它始终是你创造的 - 你释放.
但是,你应该打电话
AudioServicesRemoveSystemSoundCompletion(sound);
AudioServicesDisposeSystemSoundID(sound);
Run Code Online (Sandbox Code Playgroud)
当你不再需要声音时(最可能在你创建(或保持引用)声音的对象的dealloc方法中.不要改变这两个的顺序,否则你会有内存泄漏.
也许你会发现AppSoundEngine很有用.使用SystemSoundID和相关C函数的包装器很简单.
| 归档时间: |
|
| 查看次数: |
3963 次 |
| 最近记录: |