我在某处读到,当我们使用启用了ARC的@autoreleasepool { }
块时,编译器会生成代码以获取在块的开头和结尾调用的objc_autoreleasePoolPush()
和objc_autoreleasePoolPop()
函数分别。
但是,当我使用@autoreleasepool
块编译Objective-C文件时,即使使用-fobjc-arc
,也不会调用这两个函数。相反,编译器生成代码以在开头分配新的NSAutoreleasePool
对象(具有等同于[[NSAutoreleasePool alloc] init]
的内容)并在该末尾排出池(使用-drain
调用)。块。
那么,objc_autoreleasePoolPush()
和objc_autoreleasePoolPop()
函数是否真的应该在启用ARC的情况下调用?如果是,缺少哪些编译器选项?
答案 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
块也会使编译器生成对这两个函数的调用。