未找到符号:_objc_retainAutoreleasedReturnValue在iOS 4.3上运行ARC编译代码

时间:2012-07-18 23:36:08

标签: ios

我的代码使用5.1的基本SDK和4.0的部署构建,并使用ARC构建。

我以前在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

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

[这个用来说4.3但是我错了,所有文档都说它是iOS 4。]

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

答案 2 :(得分:0)

我同意@Paul de Lange,并让我补充说明。

我不是100%肯定,但似乎运行时机制已经存在 自Xcode 4.4以来略有改变,启用ARC的项目将开始链接libarclite_xxx.a(对于iOS4)AFTER类的+(void)加载被调用(之前,它是BEFORE)。

更详细地说,方法调用在Xcode< = 4.3:

中是这样的
  1. 链接libarclite_xxx.a
  2. class's + load
  3. 班级类别+加载
  4. int main()
  5. class's + initialize
  6. 并在Xcode> = 4.4:

    1. class's + load
    2. 链接libarclite_xxx.a
    3. 班级类别+加载
    4. int main()
    5. class's + initialize
    6. 由于添加了@autoreleasepool,我的应用程序在首次启动时崩溃了 直接在类的+ load中,并通过将其实现移动到 无论是类的初始化还是类类的+加载,一切都很好。