【问题标题】:AudioServicesAddSystemSoundCompletion callback-method is not called after a few calls几次调用后未调用 AudioServicesAddSystemSoundCompletion 回调方法
【发布时间】: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


    【解决方案1】:

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

    但是,你应该调用

    AudioServicesRemoveSystemSoundCompletion(sound);
    AudioServicesDisposeSystemSoundID(sound);
    

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

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

    【讨论】:

    • 这里的句柄是什么?它应该是健全的吗?
    猜你喜欢
    • 2012-01-07
    • 1970-01-01
    • 1970-01-01
    • 2014-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-01
    • 2020-07-14
    相关资源
    最近更新 更多