带音频的多线程

时间:2012-02-23 12:46:18

标签: objective-c xcode

我有classA具有回调音频功能,他多次调用class B函数,并将其作为音频级别的参数。

问题是它每秒发生这么多次所以我得到了这个:

class __NSCFString autoreleased with no pool in place - just leaking - break on objc_autoreleaseNoPool() to debug

我知道我需要将这个类中的一个设置为另一个线程,其中包含:

[NSThread detachNewThreadSelector:@selector(setMovement:) toTarget:self withObject:nil]; 

但我不知道我到底是怎么做的,以及放置那条线(哪个类)。 我已经尝试将它放在B类初始化中,但仍然可以得到警告。

在iPhone的崩溃上,仿真它的工作。 只有当我减少通话次数时,我才能把它放在设备上。

我究竟如何设置此线程,以及哪个类? (类是cocos2d中的场景 - 但我认为这不重要)

非常感谢/

1 个答案:

答案 0 :(得分:0)

从你的帖子中不清楚A类和B类的作用是什么。我希望我理解正确,你的A类代码在某些音频环境中反复调用classB方法。

我在这里也猜到,这些调用的来源不是你的代码,而是一些系统调用,或来自音频系统的一些外部调用。

在这种情况下,可能是音频调用源自某个线程的上下文,该线程没有自动释放池。当您在类B方法中编写代码时,您可能会创建自动释放的对象(例如[NSString stringWithFormat:@“...”,...])并且这些泄漏,因为没有自动释放池来处理它们。

这里我不确定为什么你应该分离一个新线程---如果你的问题是泄漏,你需要做的只是将B类方法内容包含在@autoreleasepool {...}中。范围。这将有助于释放所有自动释放的对象。

类似

@implementation classB
// this is the method being repeatedly called from class A's audio function
-(void)callbackImplementation:(NSInteger)voiceLevel {
    @autorelease {
    // put all your code here.
    }
    return;
}
@end