iOS 7.1 выдает ошибку после обновления до Xcode 5.1

Недавно я обновил свой Xcode до версии 5.1. После обновления он нормально работает со всеми симуляторами, кроме iOS 7.1, в котором выдает ошибку ссылки mach-O. Более того, на вкладке «Настройки сборки» есть только опция 64-битной архитектуры. По моему, это причина всех проблем и ошибок. Кто-нибудь знает причину этого и как это решить?

Вот некоторые предупреждения и ошибки, которые у меня есть:

Предупреждение :

Values of type 'NSInteger' should not be used as format arguments; add an explicit cast to 'long' instead

Ошибка:

Symbol(s) not found for architecture x86_64

Спасибо.


person demonofthemist    schedule 13.03.2014    source источник
comment
возможная копия архитектуры Arm64 в xcode 5.1   -  person nschum    schedule 13.03.2014


Ответы (3)


Xcode 5.1 изменил стандартные настройки проекта. Помимо прочего, теперь он включает архитектуру arm64 для проекта, но многие сторонние проекты еще не поддерживают ее, поэтому я рекомендую снова удалить ее из настроек архитектур (оставив вам armv7 и armv7s). Однако оставьте параметр допустимые архитектуры — это указывает, на каких архитектурах он может работать.

Он также представил активацию по умолчанию некоторых дополнительных предупреждений, таких как приведение типа к длинному предупреждению - здесь то же самое, когда вы используете некоторые другие библиотеки (в качестве исходного кода), вы можете получить много предупреждений, которые вы не можете (или не хотите). к) сделать многое о. Вы можете снова отключить предупреждения для этих проектов или сразу не обновлять настройки проекта.

person TheEye    schedule 13.03.2014
comment
Архитектуры должны быть сброшены на armv7 и armv7s, если у вас возникнут проблемы с библиотеками, но вы НЕ должны сбрасывать действительные архитектуры, так как тогда приложение не будет работать на новых iPhone. - person Christian; 30.03.2014

Добрался до настроек сборки -> Архитектуры

Вероятно, у вас установлены стандартные архитектуры, верно?

Начиная с Xcode 5.1 Standard Architectures включает arm64, который вы не готовы поддерживать.

Выберите «Другое».. Дважды щелкните $(ARCHS_STANDARD) и измените его на $(ARCHS_STANDARD_32_BIT).

Примечание. Это временное исправление. Вероятно, вы используете какую-то статическую библиотеку, которая не поставляется с 64-битным слайсом. Посмотрите, есть ли он в наличии, а затем переключите архитектуру обратно на стандартные архитектуры.

person Andrew Soltan    schedule 19.03.2014
comment
Спас мою задницу за 2 минуты до демонстрации клиента и не смог развернуться в симуляторе! Спасибо, Эндрю. Теперь, чтобы вернуться назад и понять, почему несколько методов с именем «count» с несовпадающим результатом, типы параметров... появляются с новой аркой, но не со старой. ;-) - person Mike S.; 20.03.2014
comment
thnQ @Andrew ты мне очень помог - person ashokdy; 02.04.2014

Действительно, XCode теперь включает архитектуру arm64. NSInteger теперь совершенно другой, поскольку он определен в NSObjCRuntime.h:

#if __LP64__ || (TARGET_OS_EMBEDDED && !TARGET_OS_IPHONE) || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64
typedef long NSInteger;
typedef unsigned long NSUInteger;
#else
typedef int NSInteger;
typedef unsigned int NSUInteger;
#endif

Чтобы справиться с этим, вы должны улучшить свою кодовую базу. Прежде всего, вы должны быть очень последовательны. Назначьте NSInteger только NSInteger, а не int. Избегайте всех видов:

int i = [aString integerValue] (поскольку он возвращает NSInteger)

но

NSInteger i = [aString integerValue] (и если это длинный тип, у вас не возникнет проблем.)

Кроме того, у вас может возникнуть другая проблема, когда вы хотите создать строку из значения. Что вы могли бы сделать, это что-то вроде:

#define cL(v)    (long)(v)
#define cUL(v)   (unsigned long)(v)

NSLog(@"array.count: %ld", cUL(anArray.count));

array.count возвращает беззнаковое целое число для armv7(s) и беззнаковое длинное число для arm64. Всегда прибегая к unsigned long, вы больше не будете сталкиваться с предупреждениями и, что более важно, не получите никаких ошибок.

Эта «логика» была представлена ​​самой Apple в некоторых видеороликах с техническими докладами: https://developer.apple.com/tech-talks/videos/ (видео «Архитектура современных игр для iOS». Воспроизведение видео около 10:00)

person Kevin Delord    schedule 14.03.2014