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

#iphone #ios #ios4 #automatic-ref-counting #xcode4.2

#iPhone #iOS #ios4 #автоматический подсчет ссылок #xcode4.2

Вопрос:

Я читал и слышал с тех пор, как 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 солгала? Вместо этого я предполагаю, что я в замешательстве и делаю что-то не так, но я не могу понять, что.

Это связано с выпуском Xcode 4.2 GM (сборка 4C199)

Комментарии:

1. В дополнение к тому, что говорили другие, не устанавливайте 4.2 SDK. Используйте SDK 5.0. Установите цель развертывания. Я не имею в виду это, я имею в виду в целом; старые SDK не следует использовать.

2. Вау, я не могу поверить, что я так долго не знал, что новые SDK могут создаваться для более старых версий ОС. Здесь я злюсь на Apple, что они удаляют все мои старые версии SDK:/ Спасибо!

Ответ №1:

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

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

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

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

Комментарии:

1. Спасибо (facepalm). Однако, похоже, что он также работает с 4.2 в качестве цели развертывания… теперь перейдем к тестированию на реальном устройстве.

2. Похоже, он отлично работает и на моем устройстве под управлением iOS 4.2.1.

3. Извините, похоже, @CocoaFu был прав. После того, как я перезапустил Xcode, похоже, он работает только в 4.3. Xcode 4 кажется легко запутанным: (

4. Сама Apple заявляет, что ARC доступна на «iOS 4»: developer.apple.com/library/ios/#releasenotes/ObjectiveC/… Лично я запускал приложение ARC на iPhone 3G с iOS 4.2 и iPad с iOS 4.2. Однако, если вы используете ключевое слово «weak», вы получите сообщение об ошибке при попытке сборки для iOS 4.x.

5. Я могу подтвердить, что ARC без слабой ссылочной поддержки работает как минимум на iOS 4.2.1, у меня нет ничего более старого для тестирования.

Ответ №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
  

Комментарии:

1. Эта вторая часть, о которой вы упомянули, вернулась, чтобы преследовать меня, сбой load . Скоро мы выпустим iOS 4.3, но я должен предоставить еще одно рабочее обновление для некоторых людей, отказывающихся обновлять 4.3 до 5 или 6, gaaaah.