2

我正在调用控制器字符串数据成员并使用该UTF8String方法将 NSString 对象转换为 C++ 字符串对象,这导致了内存泄漏。调用是在核心音频RenderTone函数内部进行的,如下所示:

InstrumentGridViewController *viewController = (InstrumentGridViewController *)inRefCon;
string cppTrackName = [viewController->trackName UTF8String];

虽然代码位于 for 循环中,但它会导致相当大的内存泄漏。任何想法为什么?我必须进行转换,因为我正在使用cppTrackName变量进行 c++ 函数调用。我也试过这个:string cppTrackName = "synthTrack #1";这工作正常而不会导致任何泄漏,但显然我真的需要从我的控制器中读取值。

这是控制台中的错误(不断重复):

objc[6352]: Object 0x68c3b60 of class __NSCFData autoreleased with no pool in place - just leaking - break on objc_autoreleaseNoPool() to debug
4

1 回答 1

2

更新

现在我看到了消息:

的实现-[NSString UTF8String]可以自由地假设在生成消息的线程上存在一个自动释放池。

正在从辅助(渲染)线程调用您的音频回调。显然,在您向字符串发送消息时,此线程上不存在自动释放池,因此会出现“无自动释放池”控制台消息。

在典型情况下,您将显式创建一个自动释放池。但是,这是渲染线程。如果它是实时音频线程,则不应锁定(包括堆分配)甚至不使用 objc 消息传递(因为它可以锁定,并且 objc 消息传递不能保证消息发送所需的最长时间)。ObjC API(实际上)在实时音频渲染上下文中没有位置。

于 2012-08-01T22:18:37.737 回答