2012-07-18 80 views
4

我的代码是使用5.1的基本SDK和4.0的部署构建的,并且使用ARC构建。找不到符号:_objc_retainAutoreleasedReturnValue在iOS上运行ARC编译代码4.3

我以前在4.3测试设备上运行时没有遇到过任何问题,但是它第一次崩溃。

任何想法如何解决它?

Exception Type: EXC_BREAKPOINT (SIGTRAP) 
Exception Codes: 0x00000001, 0xe7ffdefe 
Crashed Thread: 0 

Dyld Error Message: 
    Symbol not found: _objc_retainAutoreleasedReturnValue 
    Referenced from: /var/mobile/Applications/6AD37C1A-9642-4F0A-87E9-ED33EE45729D/Interactive Messages.app/Interactive Messages 
    Expected in: /usr/lib/libobjc.A.dylib 
    Dyld Version: 191.3 

Thread 0 name: Dispatch queue: com.apple.main-thread 
Thread 0 Crashed: 
0 dyld       0x2fe01080 dyld_fatal_error + 0 
1 dyld       0x2fe02a40 dyld::halt(char const*) + 48 
2 dyld       0x2fe02b00 dyld::fastBindLazySymbol(ImageLoader**, unsigned long) + 172 
3 libdyld.dylib     0x351d544e _dyld_fast_stub_entry(void*, long) + 30 
4 libdyld.dylib     0x351d5374 dyld_stub_binder + 12 
5 Interactive Messages   0x00036aee 0x1000 + 219886 
6 libobjc.A.dylib     0x350af5d4 call_load_methods + 96 
7 libobjc.A.dylib     0x350af446 load_images + 50 
8 dyld       0x2fe03d7c _ZN4dyldL12notifySingleE17dyld_image_statesPK11ImageLoader + 64 
9 dyld       0x2fe0a6a8 ImageLoader::recursiveInitialization(ImageLoader::LinkContext const&, unsigned int, ImageLoader::InitializerTimingList&) + 236 
10 dyld       0x2fe0aaaa ImageLoader::runInitializers(ImageLoader::LinkContext const&, ImageLoader::InitializerTimingList&) + 34 
11 dyld       0x2fe020dc dyld::initializeMainExecutable() + 324 
12 dyld       0x2fe06ffe dyld::_main(macho_header const*, unsigned long, int, char const**, char const**, char const**) + 1446 
13 dyld       0x2fe01286 dyldbootstrap::start(macho_header const*, int, char const**, long, macho_header const*) + 506 
14 dyld       0x2fe01058 _dyld_start + 48 
+0

也许和这个问题一样吗? http://stackoverflow.com/questions/8756418/static-library-with-arc-support-linked-to-non-arc-project-causing-linker-errors – borrrden 2012-07-18 23:51:07

+0

这是一个链接器错误,我的是一个运行时错误。 – Gruntcakes 2012-07-19 14:46:27

+1

下面的答案似乎都没有提到解决方案。你有没有设法解决这个问题? – 2013-01-13 03:04:29

回答

0

[这就要用到4.3说,但我错了,所有的文件说,它的iOS 4]

编辑:哎呀 - 一年前我开始了我的项目,并想用ARC和块。当时我有很强的理由使用4.3而不是老版本,必须得到管理层的许可,从那时起,这一切都一帆风顺。现在,我无法确定我为什么这样做。有可能在那个时候,SDK是4.3,我做了我所需要的假设。我强烈地记得我有充分的理由要求4.3(我刚刚从WWDC回来),但是现在当然我找不到任何证据来证实我的答案。这就是说,原始的海报似乎给了我这个答案 - 所以假设更改为4.3确定了他的运行时间问题。如果我找到原因,我会更新这个答案。

+0

为什么这个答案表示ARC支持4.0+,但需要将部署设置为4.3?不设置为4.3意味着它不能安装在4.0上?那么4.0如何支持? http://stackoverflow.com/questions/7747783/is-arc-really-supported-in-ios-4-the-ios-4-2-sdk-is-missing-arc-related-symbols – Gruntcakes 2012-07-19 14:48:30

+1

错误 - ARC是从iOS 4.0支持。从Apple文档... * ARC支持Mac OS X v10.6和v10.7(64位应用程序)以及iOS 4和iOS 5的Xcode 4.2。Mac OS X v10.6不支持弱引用和iOS 4. * – 2012-07-26 13:15:33

+0

这个答案是错误的。 @AshleyMills是正确的 – 2012-08-06 13:11:34

1

崩溃发生在哪里?突然开始与新的编译器发生同样的事情。

对我来说,我有一个+(void) load覆盖内的代码,它似乎已经在arclite代码正确链接之前调用过。我不确定这是可能的,但移动相同的代码到+(void) initialize工作正常。

0

我同意@Paul de Lange,让我补充一些注意事项。我不是100%确定,但它看起来运行时机制已经 自Xcode 4.4以来略有改变,启用ARC的项目将开始链接libarclite_xxx.a(对于iOS4)在类的+(void)加载被调用后(以前,这是以前)。

更详细地,方法调用是这样的在Xcode < = 4.3:

  1. LINKING libarclite_xxx.a
  2. 类的+负载
  3. 类类别的+负载
  4. INT主()
  5. class's +初始化

和在Xcode> = 4.4:

  1. 类的+负载
  2. LINKING libarclite_xxx。一个
  3. 类类别的+负载
  4. INT主()
  5. 类的+初始化

我的应用程序崩溃初始发射由于直接在类的+负载添加@autoreleasepool 的,并通过移动其执行到 任何类的+初始化或类的类+的负载,一切都很好。