未找到符号:_objc_release与IOS 4.3模拟器

时间:2012-10-15 14:25:15

标签: xcode ios4 ios-simulator automatic-ref-counting

更新:如果您的系统工作没有问题,请发表评论。这将证实这是我的设置中的问题,而不是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。编译和链接成功没有错误,尝试在模拟器上运行时失败。在我升级之前它曾经工作正常。

修改

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

正如Brad在评论中所建议的,我将库libarclite_iphoneos.a添加到项目中,但这也没有帮助。我在/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/arc中找到了这个库,这在我的视图中是一个奇怪的位置,但我在其他任何地方都找不到它。

我也在该库上执行了'nm',并且它也没有定义丢失的_objc_retain符号。它确实定义了_objc_retain$non_lazy_ptr,但不确定这意味着什么。

编辑:我发现该库被忽略了:

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

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

有什么想法吗?

1 个答案:

答案 0 :(得分: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项目,您仍需要添加" -fobjc-arc"标记为"其他链接标记",以避免相同的错误消息。