C++ 和 Objective-C 自动释放问题

标签 c++ objective-c objective-c++

我有三层,底层是用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/

相关文章:

c++ - 为什么我的 C++ 应用程序在 Core i7 上比我的 C 应用程序(使用相同的库)快

c++ - 为什么 "n"在此函数中没有递增?

ios - 从 UIViewController 更改 UIWindow backgroundColor?

ios - 将背景图片设置为 iPad 应用程序的正确方法

objective-c - 为什么此代码会给出 EXC_BAD_ACCESS(使用 IMP)

c++ - 如何调节类模板和原始类型模板

objective-c - FoundationTool 中的 Runloop

ios - 如何将 "C++ completion handler"传递给 NSURLSessionDataTask 来处理它返回的数据?

c++ - Objective-C:如果我在 ARC 的函数中返回一个 C++ 对象,它会创建一个拷贝吗?我是否必须手动释放该拷贝?

c++ - 使用 FFT (FFTW) 计算两个函数的卷积