【问题标题】:Symbol not found: _objc_retainAutoreleasedReturnValue running ARC compiled code on iOS 4.3未找到符号:_objc_retainAutoreleasedReturnValue 在 iOS 4.3 上运行 ARC 编译代码
【发布时间】:2012-07-18 02:40:36
【问题描述】:

我的代码是使用 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

【问题讨论】:

  • 大概和这个问题一样吧? stackoverflow.com/questions/8756418/…
  • 那是链接器错误,我的是运行时错误。
  • 以下答案似乎都没有谈论解决方案。您设法解决了这个问题吗?

标签: ios


【解决方案1】:

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

对我来说,我将代码放在 +(void) load 覆盖中,这似乎是在正确链接 arclite 代码之前调用的。我不确定这是否可行,但将相同的代码移至 +(void) initialize 效果很好。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 为什么这个答案说 ARC 在 4.0+ 上受支持,但需要将部署设置为 4.3?设置为 4.3 不是说不能安装在 4.0 上吗?因此 4.0 如何支持它? stackoverflow.com/questions/7747783/…
    • 错误 - iOS 4.0 支持 ARC。来自 Apple 文档... Xcode 4.2 支持 Mac OS X v10.6 和 v10.7(64 位应用程序)以及 iOS 4 和 iOS 5。Mac OS X v10 不支持弱引用.6 和 iOS 4。
    • 如果您注意到编辑,我明确表示答案是错误的 - 但将其留给后代(因为它是我最初所说的。)因为人们似乎阅读了第一行而不是编辑文本,我更改了第一行以使其 100% 清晰。
    • 好吧,他将其标记为答案,因为它确实解决了他的问题 - 更新到 4.3 修复了它。也就是说,如果实际上 ARC 在 4.0 中得到支持,他肯定还有其他问题。无论如何,我更新了答案。
    【解决方案3】:

    我同意@Paul de Lange 的观点,让我再补充一点。

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

    更详细地说,方法调用在 Xcode

    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

    由于添加了@autoreleasepool,我的应用在首次启动时崩溃了 直接在类的 +load 中,并通过将其实现移动到 无论是类的 +initialize 还是类类别的 +load,一切都很顺利。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-15
      • 2012-06-18
      • 2020-06-16
      • 1970-01-01
      • 2012-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多