正确使用@autoreleasepool
Proper Usage of @autoreleasepool
我在我的代码中混合了一些 ObjectiveC 和 C++。 (我的文件是 .mm
文件而不是 .m
。)什么时候才是用 @autoreleasepool
包装任何代码块的正确理由?不知道我在做什么,我正在包装可能包含任何非 ObjectiveC 变量的任何代码块,无论是 int
、char
、std::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)
自动释放池用于限制其中 autorelease
d 的事物的生命周期。 autorelease
是一个CocoaObjective-CAPI,所以只有Objective-C代码可以autorelease
东西。因此,将自动释放池放在您确定永远不会调用到 Objective-C 代码的纯 C/C++ 代码块周围是没有任何意义的。
自动释放池通常仅适用于循环运行多次且每次迭代可能执行大量 autorelease
的情况。请注意,并非所有 Objective-C 代码都会 autorelease
;这并不明显。有些 Cocoa API 会 autorelease
而有些不会。如果都是自己用ARC写的代码,估计不会autorelease
.
我在我的代码中混合了一些 ObjectiveC 和 C++。 (我的文件是 .mm
文件而不是 .m
。)什么时候才是用 @autoreleasepool
包装任何代码块的正确理由?不知道我在做什么,我正在包装可能包含任何非 ObjectiveC 变量的任何代码块,无论是 int
、char
、std::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)
自动释放池用于限制其中 autorelease
d 的事物的生命周期。 autorelease
是一个CocoaObjective-CAPI,所以只有Objective-C代码可以autorelease
东西。因此,将自动释放池放在您确定永远不会调用到 Objective-C 代码的纯 C/C++ 代码块周围是没有任何意义的。
自动释放池通常仅适用于循环运行多次且每次迭代可能执行大量 autorelease
的情况。请注意,并非所有 Objective-C 代码都会 autorelease
;这并不明显。有些 Cocoa API 会 autorelease
而有些不会。如果都是自己用ARC写的代码,估计不会autorelease
.