Условно увязка для @autoreleasepool

Когда я пытаюсь запустить свое приложение в симуляторе iOS 4.3 (Xcode 4.2), я сбой при ударе @autoreleasepool {}, используя:

dyld: lazy symbol binding failed: Symbol not found: _objc_autoreleasePoolPush

Я огляделся, и я вижу, что обходным путем является добавление libarclite_iphoneos.a. Там версия для симулятора тоже, как libarclite_iphonesimulator.a.

Мне нужно добавить обе библиотеки в мой проект, чтобы они запускались как на симуляторе, так и на оборудовании. Но независимо от того, что я построил, он жалуется, что другая библиотека предназначена для неподдерживаемой архитектуры.

Например, создание для симулятора:

ld: warning: ignoring file /Developer-4.2/Platforms/iPhoneOS.platform/
Developer/usr/lib/arc/libarclite_iphoneos.a, missing required architecture
i386 in file

Как я могу исправить их оба одновременно? Или я должен просто придерживаться старого синтаксиса NSAutoreleasePool?

Ответ 1

После испытаний, таких как чистая, чистая папка, перезагрузка iPhone Simulator и даже перезагрузка, я изменил IPHONE_DEPLYMENT_TARGET на настройку целевой сборки, начиная с iOS 5.0 до iOS 4.2. Работали.

Ответ 2

Вы можете использовать настройку сборки других компоновщиков ссылок для связи в библиотеке и специализировать значение на основе того, является ли это "Any iOS" или "Any iOS Simulator".

Ответ 3

Вы также можете объединить две статические библиотеки в одну универсальную библиотеку. Пойдите в Терминал и скажите

lipo -create -output /where/you/want/it/libarclite_universal.a /Developer/Platforms/iPhoneOS.platform/Developer/usr/lib/arc/libarclite_iphoneos.a /Developer/Platforms/iPhoneOS.platform/Developer/usr/lib/arc/libarclite_iphonesimulator.a

Вы можете проверить полученный файл, сказав (в терминале)

file /where/you/put/it/libarclite_universal.a

Он должен выводить:

libarclite_universal.a: Mach-O universal binary with 3 architectures
libarclite_universal.a (for architecture i386):current ar archive random library
libarclite_universal.a (for architecture armv6):current ar archive random library
libarclite_universal.a (for architecture armv7):current ar archive random library

Поскольку этот lib связан статически, ваше окончательное приложение не будет расти из-за включенной библиотеки sim, поскольку только то, что необходимо вашему приложению, будет связано с вашим окончательным приложением.