正确使用@autoreleasepool

时间:2016-02-12 22:20:01

标签: c++ objective-c memory-management xcode7 nsautoreleasepool

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

我做错了吗?

  

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

2 个答案:

答案 0 :(得分:1)

自动释放池用于限制其中autorelease d的事物的生命周期。 autorelease是一个Cocoa Objective-C API,因此只有Objective-C代码才能autorelease。因此,在一个纯C / C ++代码块周围放置自动释放池是绝对没有意义的,你肯定不会调用Objective-C代码。

自动释放池通常仅适用于循环运行多次的情况,其中每次迭代可执行大量autorelease。请注意,并非所有Objective-C代码都将autorelease;它并不明显。一些Cocoa API将autorelease而一些不会。如果它是您在ARC中编写的所有代码,则可能不会autorelease

答案 1 :(得分:-1)

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

  

Application Kit在主线程上创建一个自动释放池   事件循环的每个循环的开始,并将其排出   结束,从而释放任何生成的自动释放对象   处理事件。因此,如果您使用应用程序工具包   通常不必创建自己的池。如果你的申请   在事件循环中创建了许多临时自动释放的对象,   但是,创建“本地”自动释放池可能是有益的   有助于最小化峰值内存占用。

link