- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我在某处读到,当我们使用启用了 ARC 的 @autoreleasepool { }
block 时,编译器生成代码以获取 objc_autoreleasePoolPush()
和 objc_autoreleasePoolPop()
函数分别在 block 的开头和结尾调用。
但是,当我使用 @autoreleasepool
block 编译 Objective-C 文件时,即使使用 -fobjc-arc
也不会调用这两个函数。相反,编译器生成代码以在开始时分配一个新的 NSAutoreleasePool
对象(具有等同于 [[NSAutoreleasePool alloc] init]
的内容)并排空池(使用-drain
调用)在 block 的末尾。
那么,objc_autoreleasePoolPush()
和 objc_autoreleasePoolPop()
函数真的应该在启用 ARC 的情况下调用吗?如果是,缺少哪些编译器选项?
最佳答案
objc_autoreleasePoolPush()
和 objc_autoreleasePoolPop()
实际上应该在 @autoreleasepool
block 的开始和结束时调用,分别来自编译器生成的代码,从 OSX 10.7/iOS 5.0 开始。缺少的编译器选项是 -fobjc-runtime=macosx-10.7
。
顺便说一句,ARC 与所有这些无关,因此即使未启用 ARC,@autoreleasepool
block 也会使编译器生成对这两个函数的调用。
关于objective-c - `objc_autoreleasePoolPush()` 和 `objc_autoreleasePoolPop()` 函数和 `@autoreleasepool` block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15014152/
我在某处读到,当我们使用启用了 ARC 的 @autoreleasepool { } block 时,编译器生成代码以获取 objc_autoreleasePoolPush() 和 objc_auto
所以,我安装了 Ubuntu 和 clang3.0 以及一个简单的程序。m: #include int main() { @autoreleasepool{
我是一名优秀的程序员,十分优秀!