我在代码中混合了一些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代码可以实现。因此,将自动释放池放在纯C / C ++代码块周围绝对没有任何意义,您确定这些代码永远不会调用Objective-C代码。
自动释放池通常仅在循环运行多次且每次迭代可能执行大量autorelease
的情况下才有用。请注意,并非所有的Objective-C代码都会autorelease
;这不是很明显。有些可可API将autorelease
,有些则不会。如果所有代码都是用ARC编写的,则可能不是autorelease
。