3

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

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

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

4

2 回答 2

3

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

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

于 2013-02-21T23:43:47.530 回答
2

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

于 2013-02-21T23:24:19.787 回答