正确使用@autoreleasepool

Proper Usage of @autoreleasepool

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

我做错了吗?

Note that on previous questions sort of related to this question, they talk about using alloc, init, and release, and these seem to be deprecated now in XCode7+. So, I need the latest advice on this, not old advice. I need advice pertaining to XCode7 or greater.

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

The Application Kit creates an autorelease pool on the main thread at the beginning of every cycle of the event loop, and drains it at the end, thereby releasing any autoreleased objects generated while processing an event. If you use the Application Kit, you therefore typically don’t have to create your own pools. If your application creates a lot of temporary autoreleased objects within the event loop, however, it may be beneficial to create “local” autorelease pools to help to minimize the peak memory footprint.

(link)

自动释放池用于限制其中 autoreleased 的事物的生命周期。 autorelease是一个CocoaObjective-CAPI,所以只有Objective-C代码可以autorelease东西。因此,将自动释放池放在您确定永远不会调用到 Objective-C 代码的纯 C/C++ 代码块周围是没有任何意义的。

自动释放池通常仅适用于循环运行多次且每次迭代可能执行大量 autorelease 的情况。请注意,并非所有 Objective-C 代码都会 autorelease;这并不明显。有些 Cocoa API 会 autorelease 而有些不会。如果都是自己用ARC写的代码,估计不会autorelease.