`язык autoreleasePoolPush () " и "язык autoreleasePoolPop (функций)" и " блоки@autoreleasepool`


Я где-то читал, что при использовании блоков @autoreleasepool { } с включенной дугой компилятор генерирует код для получения функций objc_autoreleasePoolPush() и objc_autoreleasePoolPop(), вызываемых в начале и в конце блока соответственно.

Однако, когда я компилирую файл Objective-C с блоками @autoreleasepool, эти две функции не вызываются, даже с -fobjc-arc. Вместо этого компилятор генерирует код для выделения нового объекта NSAutoreleasePool (с чем-то эквивалентным [[NSAutoreleasePool alloc] init]) в начале и для слива пула (с -drain звонок) в конце квартала.

Итак, действительно ли функции objc_autoreleasePoolPush() и objc_autoreleasePoolPop() должны вызываться с включенной дугой? Если да, то какие параметры компилятора отсутствуют?

2 2

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.