2

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

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

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

+1

Включен ли ARC, не имеет значения. Блок '@autoreleasepool {}' скомпилирован в 'objc_autoreleasePoolPush()' и 'objc_autoreleasePoolPop()' независимо от ARC. – newacct

+0

@newacct Да, вы абсолютно правы. – LuisABOL

ответ

1

objc_autoreleasePoolPush() и objc_autoreleasePoolPop() действительно должен быть вызван в начале и в и из @autoreleasepool блока, соответственно, из кода, генерируемого компилятором, начиная с OSX 10.7/прошивкой 5.0. Недопустимая опция компилятора - -fobjc-runtime=macosx-10.7.

И, кстати, ARC не имеет ничего общего со всем этим, поэтому блоки @autoreleasepool заставляют компилятор генерировать вызовы для этих двух функций, даже если ARC не включен.

2

Какова цель установки для развертывания? Возможно, потребуется OSX 10.8/iOS 6, чтобы получить новый способ сделать что-то.

+0

На самом деле, я не использую XCode. Я компилирую его из командной строки. Итак, знаете ли вы, есть ли опция «clang» для установки цели из командной строки? – LuisABOL

+0

Попробуйте '-isysroot $ PATH_TO_YOUR/Developer/SDKs/MacOSX10.8.sdk' и' -mmacosx-version-min = 10.8' Также вы используете какой уровень оптимизации? Работа autoreleasepool может быть встроена. – iluvcapra

+1

@iluvcapra Спасибо за ответ. Я сейчас не на своем Mac, но я попробую эти варианты, когда вернусь домой. Однако второй ответ решил мою проблему. '-fobjc-runtime = macosx-10.7' заставляет clang генерировать код для вызова' objc_autoreleasePoolPush() 'и' objc_autoreleasePoolPop() '. – LuisABOL

 Смежные вопросы

  • Нет связанных вопросов^_^