正确使用@autoreleasepool



我在代码中混合了一些ObjectiveC和C++。(我的文件是.mm文件而不是.m。什么时候用@autoreleasepool包装任何代码块的正确理由是什么?不知道我在做什么,我正在包装任何可能包含任何非ObjectiveC变量的代码块,无论是intcharstd::string,还是非ObjectiveC变量的任何指针。因此,我的C++类中的每个类方法内部都有一个@autoreleasepool包装器。

我做错了吗?

请注意,在

之前与这个问题相关的问题上,他们谈论使用alloc,init和release,这些似乎在XCode7+中已被弃用。所以,我需要最新的建议,而不是旧的建议。我需要有关 XCode7 或更高版本的建议。

自动释放池用于限制在其中autorelease的事物的生存期。 autorelease是一个Cocoa Objective-C API,所以只有Objective-C代码可以autorelease东西。因此,在纯 C/C++ 代码块周围放置一个自动发布池是没有任何意义的,你确定这些代码永远不会调用 Objective-C 代码。

自动释放池通常仅在以下情况下有用:循环运行多次,其中每次迭代都可能执行大量autorelease。请注意,并非所有 Objective-C 代码都会autorelease;这并不明显。有些可可原料药会autorelease,有些不会。如果全是你自己用ARC编写的代码,那恐怕autorelease不。

如果您使用的是 AppKit,则不必创建自动发布池:

应用程序工具包在主线程上创建自动释放池 事件循环的每个循环的开始,并在 结束,从而释放在 处理事件。如果您使用应用程序套件,则 通常不必创建自己的池。如果您的申请 在事件循环中创建大量临时自动释放的对象, 但是,创建"本地"自动发布池以 有助于最大程度地减少峰值内存占用。

(链接)

相关内容

  • 没有找到相关文章

最新更新