1

更新:当您的系统正常工作时,请发表评论。这将确认这是我的设置中的问题,而不是 XCode 中的错误。

将我的开发系统升级到 XCode 4.5.1 并使用 IOS SDK 6.0 编译后,在 IOS 4.3 模拟器上运行时出现以下错误:

dyld: lazy symbol binding failed: Symbol not found: _objc_release
  Referenced from: /Users/baraupp/Library/Application Support/iPhone Simulator/4.3.2/Applications/AFD73AB4-7047-468B-A20B-9C941850ED3C/Flyskyhy.app/Flyskyhy
  Expected in: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.3.sdk/System/Library/Frameworks/Foundation.framework/Foundation

dyld: Symbol not found: _objc_release
  Referenced from: /Users/baraupp/Library/Application Support/iPhone Simulator/4.3.2/Applications/AFD73AB4-7047-468B-A20B-9C941850ED3C/Flyskyhy.app/Flyskyhy
  Expected in: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.3.sdk/System/Library/Frameworks/Foundation.framework/Foundation

我已将部署目标设置为 4.3,并在项目中使用 ARC,在 -fno-objc-arc 上有一些文件。编译和链接成功,没有错误,尝试在模拟器上运行时失败。在我升级之前它曾经工作正常。

编辑

我发现了一个类似的 Stackoverflow 问题,它问的问题几乎完全相同,它的答案建议将 -fobjc-arc 添加到其他链接器标志。不幸的是,这并没有解决我的问题。编辑:我检查了链接阶段实际使用的标志,并且 -fobjc-arc 标志在链接时存在,也没有我明确添加 -fobjc-arc 。

正如布拉德在评论中所建议的那样,我将库添加libarclite_iphoneos.a到项目中,但这也无济于事。我在 /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/arc 中找到了该库,在我看来这是一个奇怪的位置,但我在其他任何地方都找不到它。

我也在那个库上做了'nm',它也没有定义丢失的_objc_retain符号。它确实定义了 a _objc_retain$non_lazy_ptr,但不确定这意味着什么。

编辑:我发现图书馆被忽略了:

ld: warning: ignoring file libarclite_iphoneos.a, missing required architecture i386 in file libarclite_iphoneos.a

很明显,它不是正确的文件。但是我在系统的其他任何地方都找不到相同的文件(我用“find”搜索过)。

有任何想法吗?

4

1 回答 1

2

该问题是由类类别中的 +initialize 方法触发的。显然,Apple 链接器没有正确处理这种情况。

在网上搜索了很多之后,我看到其他人也遇到了 +load 和 +initialize 方法、ARC 和 4.3 兼容性的问题。

就我而言,我在一个类别中初始化了一个静态变量,如下所示:

@implementation NSDictionary (FormAccess)

static NSRegularExpression *pattern;

+ (void) initialize
{
    pattern = [[NSRegularExpression alloc] initWithPattern:@"(\\w+)|\\[([0-9]+)\\]" options:0 error:nil];
}

...

@end

当我第一次使用变量时将其替换为显式初始化时,问题就消失了。我不需要添加任何链接器标志。

请注意,如果您有一个使用某些 ARC 文件的非 ARC 项目,您仍然需要在“Other Linker Flags”中添加“-fobjc-arc”标志,以避免出现相同的错误消息。

于 2012-10-18T16:05:31.517 回答