Подтвердить что ты не робот

Действительно ли ARC поддерживается в iOS 4? В iOS 4.2 SDK отсутствуют символы, связанные с ARC, при соединении времени

Я читал и слышал, так как 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)

4b9b3361

Ответ 1

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, не забудьте также установить цель развертывания.

Ответ 2

Немного поздно, но это важная информация. Принятый ответ правильный, 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