#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.