Трудности при запуске приложения iOS 5 на iOS 4 - PullRequest
4 голосов
/ 30 декабря 2011

У меня есть приложение для iPhone с целью развертывания 4.0 и базой SDK 5.0. Приложение работает нормально на симуляторе iOS 5, но когда я тестирую симулятор 4.3, приложение зависает, и я получаю следующее:

dyld: ленивая привязка символа не удалась: символ не найден: _objc_retainAutoreleasedReturnValue Ссылка на: / Пользователи / joakim / Библиотека / Поддержка приложений / iPhone Имитатор / 4.3.2 / Применения / F6CE76EA-DA7E-4BAC-A3AC-3CE2B51C0CD9 / PingPalARC.app / PingPalARC Ожидается в: /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.3.sdk/System/Library/Frameworks/Foundation.framework/Foundation

dyld: символ не найден: _objc_retainAutoreleasedReturnValue
Ссылка на: / Пользователи / joakim / Библиотека / Поддержка приложений / iPhone Имитатор / 4.3.2 / Применения / F6CE76EA-DA7E-4BAC-A3AC-3CE2B51C0CD9 / PingPalARC.app / PingPalARC Ожидается в: /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.3.sdk/System/Library/Frameworks/Foundation.framework/Foundation

sharedlibrary apply-load-rules all (gdb)

Проект не использует ARC по умолчанию, однако есть несколько классов, поскольку я включил ARC с флагом -fobjc-arc в разделе источников компиляции

Я не использую слабые ссылки и не использую раскадровки, поэтому не могу понять, почему мое приложение не должно работать на iOS 4.x. Может кто-нибудь сказать мне, что я пропустил, чтобы мое приложение работало на iOS 4 и 5.

Добавлены рамки: Конфигурация системы Набор карт CFNetwok Базовое расположение

Ответы [ 3 ]

3 голосов
/ 30 декабря 2011

Вы используете ARC, который не встроен в iOS 4. Вы установили цель развертывания на 4, поэтому библиотека arclite включена для вас? https://devforums.apple.com/message/588316

(Ах, похоже, что вы это сделали, но не сообщаете IDE о том, что используете ARC. Поэтому вам придется включить его самостоятельно.)

2 голосов
/ 30 декабря 2011

Не совсем ответ, но немного больше информации, если это поможет кому-то более знающему, чем я ...

objc_retainAutoreleasedReturnValue(obj) является новинкой для iOS 5 и в значительной степени соответствует названию.Концептуально, если номинированный объект находится в пуле автоматического выпуска, то он удаляется оттуда, неявно сохраняя его, и подходящий выпуск добавляется позднее.Таким образом, это способ избежать проблемы узкого места в памяти, которая может возникнуть, когда концептуально временные объекты накапливаются в пуле автоматического выпуска.Так что это оптимизация, а не новая часть поведения.

Компилятор ARC вставит его в один из ваших файлов ARC, где какой-либо метод получит объект, выпущенный автоматически.Как вы говорите, он не связан как со слабыми ссылками, так и с раскадровками, и по логике вещей вы просто не могли бы этого сделать, чтобы сохранить совместимость с iOS 4.

Сказав все это, я не совсем уверен в обходном пути, с другой сторонычем очевидное, но, вероятно, очень трудное для восприятия - измените ваши классы ARC так, чтобы они никогда не получали объекты с автоматическим выпуском или полностью отключали ARC.Apple не позволяет развертывать динамически связанные библиотеки, поэтому я не могу придумать безопасный способ предложить альтернативу objc_retainAutoreleasedReturnValue для устройств iOS 4.

1 голос
/ 24 июля 2012

Добавьте все временные объявления переменных внутри блока autoreleasepool внутри функции.

...