`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` 块的主要内容,如果未能解决你的问题,请参考以下文章