Функции `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, чтобы получить новый способ ведения дел.

Другие вопросы по тегам