我正在调用控制器字符串datamember并使用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
答案 0 :(得分:2)
<强>更新强>
现在我已经看到了这条消息:
-[NSString UTF8String]
的实现可以自由地假设在发出消息的线程上存在自动释放池。
正在从辅助(渲染)线程调用您的音频回调。显然,在您发送字符串时,此线程上不存在自动释放池,因此“无自动释放池”控制台消息。
在典型情况下,您将显式创建自动释放池。 然而,这是渲染线程。如果它是实时音频线程,则不应该锁定(包括堆分配)或甚至使用objc消息传递(因为它可以锁定,并且objc消息传递不保证消息发送所花费的最长时间)。 ObjC API(实际上)在实时音频渲染上下文中没有任何地方。