我有三层,底层是用C++写的,另外两个中间层和顶层都是Objective-C。
C++层在中间层存储类的引用,中间层也存储顶层类的引用。
底层收到中间层的请求后,负责异步调用中间层的方法,中间层再调用顶层的方法。
不幸的是,我的代码报告如下错误:
* _NSAutoreleaseNoPool(): 类 NSCFNumber 的对象 0x523e50 自动释放,没有适当的池 - 只是泄漏 堆栈:(0x95c83f0f 0x95b90442 0x28d3 0x2d42 0x95b96e0d 0x95b969b4 0x93a00155 0x93a00012)
问题是顶层的方法是从没有自动释放池的 C++ POSIX 线程调用的。我能想到的唯一解决方案是在中间层添加以下内容:
bool temp = false;
- (void) method ...
{
if (!temp)
{
temp = true;
NSAutoreleasePool *arPool = [[NSAutoreleasePool alloc] init];
}
call_to_the_top_layer();
}
这行得通。我的问题是还有其他更好的解决方案吗?这很丑……
最佳答案
总是分配一个自动释放池,没问题。但是你也需要释放池,否则你有内存泄漏:
- (void) method
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
// start doing some work, for example:
call_to_the_top_layer();
[pool release];
}
您始终可以创建池,但必须在同一个 block 中释放它。通常你不需要这样做,除非你创建一个新线程或者有时在循环中分配大量临时值以避免过多的垃圾堆积并填满内存。
关于C++ 和 Objective-C 自动释放问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3854519/