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