`objc_autoreleasePoolPush()` 和 `objc_autoreleasePoolPop()` 函数和 `@autoreleasepool` 块

Posted

技术标签:

【中文标题】`objc_autoreleasePoolPush()` 和 `objc_autoreleasePoolPop()` 函数和 `@autoreleasepool` 块【英文标题】:`objc_autoreleasePoolPush()` and `objc_autoreleasePoolPop()` functions and `@autoreleasepool` blocks 【发布时间】:2013-02-21 23:21:09 【问题描述】:

我在某处读到,当我们在启用 ARC 的情况下使用 @autoreleasepool 块时,编译器会生成代码以分别在块的开头和结尾调用 objc_autoreleasePoolPush()objc_autoreleasePoolPop() 函数。

然而,当我用@autoreleasepool 块编译一个Objective-C 文件时,这两个函数不会被调用,即使是-fobjc-arc。相反,编译器生成代码以在开始时分配一个新的NSAutoreleasePool 对象(与[[NSAutoreleasePool alloc] init] 等效)并在块的末尾排空池(使用-drain 调用)。

那么,objc_autoreleasePoolPush()objc_autoreleasePoolPop() 函数真的应该在启用 ARC 的情况下调用吗?如果是,缺少哪些编译器选项?

【问题讨论】:

ARC 是否启用无关紧要。 @autoreleasepool 块被编译为 objc_autoreleasePoolPush()objc_autoreleasePoolPop() 而不管 ARC。 @newacct 是的,你完全正确。 【参考方案1】:

objc_autoreleasePoolPush()objc_autoreleasePoolPop() 实际上应该分别在从 OSX 10.7/ios 5.0 开始的编译器生成的代码中分别在 @autoreleasepool 块的开头和 和 处调用。缺少的编译器选项是-fobjc-runtime=macosx-10.7

顺便说一句,ARC 与这一切无关,因此@autoreleasepool 块使编译器即使在未启用 ARC 的情况下也会生成对这两个函数的调用。

【讨论】:

【参考方案2】:

您的部署目标是什么?可能需要 OSX 10.8/iOS 6 才能获得更新的处理方式。

【讨论】:

其实我没有使用 XCode。我正在从命令行编译它。那么,您知道是否有任何clang 选项可以从命令行设置目标? 试试-isysroot $PATH_TO_YOUR/Developer/SDKs/MacOSX10.8.sdk-mmacosx-version-min=10.8 还有你正在使用什么级别的优化? autoreleasepool 工作可能会被内联。 @iluvcapra 感谢您的回答。我现在不在我的 Mac 上,但我回家后会尝试这些选项。但是,第二个答案解决了我的问题。 -fobjc-runtime=macosx-10.7 使 clang 生成代码以调用 objc_autoreleasePoolPush()objc_autoreleasePoolPop()

以上是关于`objc_autoreleasePoolPush()` 和 `objc_autoreleasePoolPop()` 函数和 `@autoreleasepool` 块的主要内容,如果未能解决你的问题,请参考以下文章