几次调用后,不调用AudioServicesAddSystemSoundCompletion回调方法

时间:2011-06-20 10:58:12

标签: iphone objective-c xcode 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);

播放声音:

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

1 个答案:

答案 0 :(得分:5)

如果您在应用程序的生命周期内只创建一次声音(并设置声音完成),那么从内存管理的角度来看应该没问题。它始终是你创造的 - 你释放。

但是,你应该致电

AudioServicesRemoveSystemSoundCompletion(sound);
AudioServicesDisposeSystemSoundID(sound);

当你不再需要声音时(最可能在你创建(或保持引用)声音的对象的dealloc方法中。不要改变这两个的顺序,否则你会有内存泄漏。

也许你会发现AppSoundEngine有用。使用SystemSoundID和相关C函数的包装器很简单。