我在我的代码中混合了一些ObjectiveC和C ++。 (我的文件是.mm
个文件而不是.m
。)什么时候用@autoreleasepool
包装任何代码块的正确理由是什么时候?不知道我在做什么,我正在包装任何可能包含任何非ObjectiveC变量的代码块,无论是int
,char
,std::string
还是其任何指针一个非ObjectiveC变量。因此,我的C ++类中的每个类方法都包含一个@autoreleasepool
包装器。
我做错了吗?
请注意,在之前的问题与此问题有关,他们谈论使用alloc,init和release,现在这些在XCode7 +中似乎已被弃用。所以,我需要最新的建议,而不是老建议。我需要有关XCode7或更高版本的建议。
答案 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)