@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语法?

经过清理文件夹、重置iPhone Simulator甚至重启等试验后,我将目标构建设置上的IPHONE_DEPLYMENT_TARGET从iOS 5.0更改为iOS 4.2。工作。

你可以使用Other Linker Flags构建设置来链接库,并根据它是"Any iOS"还是"Any iOS Simulator"来专一化该值

您还可以将两个静态库合并为一个通用库。到终端,输入

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

您可以通过输入(在Terminal中)

来验证结果文件
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

因为这个库是静态链接的,你的最终应用程序不会因为包含sim库而增长,因为只有你的应用程序需要的东西才会被链接到你的最终应用程序中。

最新更新