Функции `objc_autoreleasePoolPush()` и `objc_autoreleasePoolPop()` и блоки `@autoreleasepool`
Я где-то читал, что когда мы используем @autoreleasepool { }
блоки с включенным ARC, компилятор генерирует код, чтобы получить objc_autoreleasePoolPush()
а также objc_autoreleasePoolPop()
функции, вызываемые в начале и в конце блока, соответственно.
Однако, когда я компилирую файл Objective C с @autoreleasepool
блоки, эти две функции не вызывают, даже если -fobjc-arc
, Вместо этого компилятор генерирует код для выделения нового NSAutoreleasePool
объект (с чем-то эквивалентным [[NSAutoreleasePool alloc] init]
) в начале и осушить бассейн (с -drain
вызов) в конце блока.
Итак, являются objc_autoreleasePoolPush()
а также objc_autoreleasePoolPop()
функции действительно должны вызываться с включенным ARC? Если да, какие параметры компилятора отсутствуют?
2 ответа
objc_autoreleasePoolPush()
а также objc_autoreleasePoolPop()
действительно должны быть вызваны в начале и на и @autoreleasepool
блокировать соответственно код, сгенерированный компилятором, начиная с OSX 10.7/ iOS 5.0. Отсутствует опция компилятора -fobjc-runtime=macosx-10.7
,
И, кстати, ARC не имеет ничего общего со всем этим, так что @autoreleasepool
блоки заставляют компилятор генерировать вызовы к этим двум функциям, даже если ARC не включен.
Какова ваша цель развертывания? Это может быть OSX 10.8/iOS 6, чтобы получить новый способ ведения дел.