我在某处读到,当我们使用启用ARC的@autoreleasepool { }
块时,编译器会生成代码,分别在块的开头和结尾调用objc_autoreleasePoolPush()
和objc_autoreleasePoolPop()
函数。
然而,当我使用@autoreleasepool
块编译Objective-C文件时,即使使用-fobjc-arc
,也不会调用这两个函数。相反,编译器生成代码,在开始时分配一个新的NSAutoreleasePool
对象(具有相当于[[NSAutoreleasePool alloc] init]
的东西),并在块结束时耗尽池(具有-drain
调用)。
那么,objc_autoreleasePoolPush()
和objc_autoreleasePoolPop()
函数真的应该在启用ARC的情况下调用吗?如果是,缺少哪些编译器选项?
objc_autoreleasePoolPush()
和objc_autoreleasePoolPop()
实际上应该分别在@autoreleasepool
块的开头和和和处调用,从OSX 10.7/iOS 5.0开始,由编译器生成代码。缺少的编译器选项是-fobjc-runtime=macosx-10.7
。
顺便说一句,ARC与这一切无关,因此即使没有启用ARC,@autoreleasepool
块也会使编译器生成对这两个函数的调用。
您的部署目标设置为什么?它可能需要OSX 10.8/iOS 6才能获得更新的做事方式。