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

4

我的代码使用基础SDK版本为5.1和部署版本为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

可能和这个问题一样?https://dev59.com/u2oy5IYBdhLWcg3wHqiB - borrrden
那是一个链接器错误,我的是运行时错误。 - Gruntcakes
1
以下任何答案似乎都没有提到解决方案。你成功解决了这个问题吗? - Geoff Evason
3个回答

1

崩溃发生在哪里?我使用新的编译器突然出现了同样的问题。

对我来说,代码位于 +(void) load 重写中,似乎在 arclite 代码正确链接之前就已经被调用了。我不确定这是否可能,但将相同的代码移动到 +(void) initialize 中就可以正常工作。


0

我同意@Paul de Lange的观点,并补充一些注释。

我不是100%确定,但似乎自Xcode 4.4以来,运行时机制已经略有改变,即启用ARC的项目将在调用类的+(void)load之后(之前是在之前)开始链接libarclite_xxx.a(适用于iOS4)。

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

  1. 链接libarclite_xxx.a
  2. 类的+load
  3. 类别的+load
  4. int main()
  5. 类的+initialize

而在Xcode >= 4.4中:

  1. 类的+load
  2. 链接libarclite_xxx.a
  3. 类别的+load
  4. int main()
  5. 类的+initialize

我的应用程序在初始启动时崩溃,因为直接在类的+load中添加了@autoreleasepool,通过将其实现移动到类的+initialize或类别的+load中,一切都正常了。


0

[这里原本写着4.3,但我错了,所有文档都说是iOS 4。]

编辑:我一年前开始我的项目,想使用ARC和blocks。当时我有一些强烈的理由要使用4.3而不是旧版本,必须得到管理层的许可,从那时起一切都很顺利。现在,我无法确定为什么我这样做。可能当时的SDK是4.3,我就做出了这个假设。我强烈记得我有一个很好的理由要求4.3(我刚从WWDC回来),但现在当然找不到任何证据来证实我的答案。话虽如此,原帖作者似乎已经给了我这个答案 - 所以假设改变到4.3解决了他的运行时问题。如果我找到原因,我会更新这个答案。


为什么这个答案说ARC在4.0以上版本是支持的,但需要将部署设置为4.3?将其设置为4.3不意味着不能安装在4.0上吗?那么它如何支持4.0?https://dev59.com/Xmsz5IYBdhLWcg3wpZry - Gruntcakes
1
错误 - ARC只支持iOS 4.0及以上版本。来自苹果文档...ARC在Xcode 4.2中支持Mac OS X v10.6和v10.7(64位应用程序),以及iOS 4和iOS 5。弱引用在Mac OS X v10.6和iOS 4中不受支持。 - Ashley Mills
如果您注意到了编辑部分,我明确表示答案是错误的 - 但为了纪念(因为这是我最初陈述的内容),我将其保留。由于人们似乎只读第一行而不是编辑文本,我更改了顶部行以使其100%清晰。 - David H
他将其标记为答案,因为它确实解决了他的问题——更新到4.3版本后问题得以解决。话虽如此,如果事实上ARC在4.0中是受支持的,那么他必须有其他问题。无论如何,我已经更新了答案。 - David H

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接