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

时间:2013-02-21 23:21:10

标签: objective-c automatic-ref-counting objective-c-runtime nsautoreleasepool

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

但是,当我使用@autoreleasepool块编译Objective-C文件时,即使使用-fobjc-arc,也不会调用这两个函数。相反,编译器生成代码以在开头分配新的NSAutoreleasePool对象(具有等同于[[NSAutoreleasePool alloc] init]的内容)并在该末尾排出池(使用-drain调用)。块。

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

2 个答案:

答案 0 :(得分:2)

您的部署目标设置为什么?它可能需要是OSX 10.8 / iOS 6才能获得更新的工作方式。

答案 1 :(得分:2)

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

顺便说一句,ARC与所有这些无关,所以即使未启用ARC,@autoreleasepool块也会使编译器生成对这两个函数的调用。