我的应用程序结构如下,
核心部分是用 C++ 编写的,并大量使用线程,我正在其上用 Objective C 开发 UI,
如果我不执行线程,它工作正常,但我无法禁用、停止线程,UI 在日志中随机崩溃,我可以看到以下消息
__NSAutoreleaseNoPool(): Object 0x350270 of class NSCFString autoreleased with no pool in place - just leaking
类似的消息不止一次出现,
通过谷歌搜索知道,我需要设置 NSAutoReleasePool 来摆脱它,但是如何将其与 C++ 代码集成。
Edit:核心库将从 UI 激活,因此我想,可以肯定地说 UI 正在主线程中运行,Lib 正在创建/终止线程而不通知 UI,
在这种情况下,我可以在 UI 中调用 AutoReleasePool
有人可以指导我吗?
请参阅这些文档,了解有关 Cocoa 多线程的知识:http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Multithreading/ThreadSafetySummary/ThreadSafetySummary.html http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Multithreading/ThreadSafetySummary/ThreadSafetySummary.html
像您一样设计您的应用程序是可以的,但应记住两件事:
- 当在主线程上操作视图(AppKit 或 UIKit)等 UI 控件时,生活是最简单的(有时也是必要的)。您可以在后台线程上使用 Foundation 对象和一些 AppKit/UIKit 对象,并且一些 Foundation 对象可以在多个线程中使用。
- 如果您在后台线程中使用任何 Cocoa 对象,则需要在这些线程上设置自动释放池。
Like so:
- (void)backgroundThreadStart
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
// do stuff
[pool release];
}
这将修复您的控制台错误,但您可能会遇到其他导致您看到的实际崩溃的问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)