我有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中的场景 - 但我认为这不重要)
非常感谢/
答案 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