Действительно ли ARC поддерживается в iOS 4? В iOS 4.2 SDK отсутствуют символы, связанные с ARC, во время соединения - PullRequest
32 голосов
/ 13 октября 2011

Я читал и слышал с тех пор, как ARC впервые объявили, что это было во время компиляции и будет обратно совместимо с iOS 4. Я успешно реорганизовал свой проект в ARC с помощью автоматического рефакторинга Xcode 4.2, и когда скомпилировано с iOS 5.0 SDK, работает нормально. Однако, если я пытаюсь скомпилировать с моим iOS 4.2 SDK, он завершается ошибкой во время соединения, пропуская следующие символы:

  • _objc_retainAutoreleaseReturnValue
  • _objc_autoreleaseReturnValue
  • _objc_storeStrong
  • _objc_retain
  • _objc_release
  • _objc_retainAutoreleasedReturnValue

Я проверил, и эти символы присутствуют в 5.0, но не 4.2:

iPhoneOS5.0.sdk/usr/lib $ find . -type f|xargs nm|grep -i _objc_retain$
00005ed0 T _objc_retain
000061d0 T _objc_retain

iPhoneOS4.2.sdk/usr/lib $ find . -type f|xargs nm|grep -i _objc_retain$
[... *crickets* ...]

Значит ли это, что Apple соврала? Вместо этого я предполагаю, что я смущен и делаю что-то не так, но я не могу понять, что.

Это с выпуском GM Xcode 4.2 (Build 4C199)

Ответы [ 2 ]

34 голосов
/ 13 октября 2011

ARC поддерживается на iOS 4.3 и выше. Вам нужно использовать iOS 5.x SDK, но вы можете выбрать iOS 4.3 для цели развертывания. Единственное, что не поддерживается в 4.x - это автоматическое обнуление слабых ссылок.

См. Документацию Apple здесь , чтобы узнать индекс доступности функций Objective-C.

Xcode 4.4 и 4.5 можно использовать для отправки приложений.

Обратите внимание, что подписка NSDictionary и NSArray развертывается обратно в OS X 10.6 и iOS 4, также обязательно установите цель развертывания.

11 голосов
/ 28 августа 2012

Немного поздно, но это важная информация.Принятый ответ правильный: Apple заявляет iOS 4.0 и выше в качестве минимальной ОС для поддержки ARC.

Однако в некоторых ситуациях она может сломаться.Одним из них, конечно же, является ключевое слово __weak и его производные.Вы увидите ошибку, подобную следующей:

dyld: lazy symbol binding failed: Symbol not found: _objc_initWeak

Вторым и очень опасным условием является использование +load метода NSObject.Если вы сделаете это с помощью ARC на iOS 4.x, у вас будут сбои во время выполнения, которые очень трудно найти.Если вы получаете ошибки во время выполнения, как показано ниже, проверьте ваши +load методы.Для меня это помогло установить флаг -fno-objc-arc для этого конкретного файла.

dyld: lazy symbol binding failed: Symbol not found: _objc_retainAutoreleasedReturnValue
...