我在代码中混合了一些ObjectiveC和C++。(我的文件是.mm
文件而不是.m
。什么时候用@autoreleasepool
包装任何代码块的正确理由是什么?不知道我在做什么,我正在包装任何可能包含任何非ObjectiveC变量的代码块,无论是int
,char
,std::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,则不必创建自动发布池:
应用程序工具包在主线程上创建自动释放池 事件循环的每个循环的开始,并在 结束,从而释放在 处理事件。如果您使用应用程序套件,则 通常不必创建自己的池。如果您的申请 在事件循环中创建大量临时自动释放的对象, 但是,创建"本地"自动发布池以 有助于最大程度地减少峰值内存占用。
(链接)