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、アークライトコードが適切にリンクされる前に呼び出されたように見えるオーバーライド内にコードがありました。これが可能かどうかはわかりませんが、同じコードを に移動すると+(void) initializeうまくいきました。

于 2012-08-06T13:17:07.250 に答える
0

@Paul de Langeに同意します。さらにメモを追加させてください。

100% 確実ではありませんが、Xcode 4.4 以降、ランタイム メカニズムがわずかに変更されたようです。その ARC 対応プロジェクトは、libarclite_xxx.a (iOS4 の場合) のリンクを開始します。クラスの +(void)load が呼び出された後 (以前は BEFORE でした) )。

より詳細には、メソッド呼び出しは Xcode <= 4.3 では次のようになります。

  1. リンク libarclite_xxx.a
  2. クラスの+負荷
  3. クラス カテゴリの +load
  4. int main()
  5. クラスの +initialize

Xcode >= 4.4:

  1. クラスの+負荷
  2. リンク libarclite_xxx.a
  3. クラス カテゴリの +load
  4. int main()
  5. クラスの +initialize

クラスの +load に @autoreleasepool を直接追加したため、最初の起動時にアプリがクラッシュしました。その実装をクラスの +initialize またはクラス カテゴリの +load に移動すると、すべてがうまくいきました。

于 2012-09-21T10:35:22.780 に答える
0

[これは 4.3 と言っていましたが、私は間違っていました。すべてのドキュメントには iOS 4 と書かれています。]

編集: Grrr - 私は 1 年前にプロジェクトを開始し、ARC とブロックを使用したいと考えていました。当時、古いリリースではなく 4.3 を使用する強い理由があり、経営陣から許可を得る必要がありましたが、それ以降はすべて順風満帆でした。今、なぜ私がこれをしたのかを判断できません。当時、SDK は 4.3 だった可能性があり、それが必要であると仮定しました。4.3 を要求する正当な理由があったことを強く思い出します (WWDC から戻ってきたばかりでした) が、もちろん、私の答えを実証するものは何も見つかりません。そうは言っても、元のポスターがこれに対する答えを私に与えたようです.4.3に変更すると、彼のランタイムの問題が修正されたと仮定します. 理由が見つかったら、この回答を更新します。

于 2012-07-19T00:28:32.167 に答える