4

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

3 回答 3

1

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

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

于 2012-08-06T13:17:07.250 回答
0

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

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

于 2012-07-19T00:28:32.167 回答
0

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

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

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

  1. 链接 libarclite_xxx.a
  2. 类的 +load
  3. 类类别的 +load
  4. 主函数()
  5. 类的 +initialize

在 Xcode >= 4.4 中:

  1. 类的 +load
  2. 链接 libarclite_xxx.a
  3. 类类别的 +load
  4. 主函数()
  5. 类的 +initialize

由于在类的 +load 中直接添加了@autoreleasepool,我的应用程序在首次启动时崩溃了,并且通过将其实现移动到类的 +initialize 或类类别的 +load 中,一切都很好。

于 2012-09-21T10:35:22.780 回答