2012-04-01 8 views
6

私はXcode 4.3.1、iOS 5.1を持っていて、私のアプリを作るためにARCがオンになっています。アプリはデバッグビルドで正常に動作しますが、リリースビルド時にクラッシュする可能性があります。

アプリはデバッグビルドで正常に動作しますが、リリースビルドではクラッシュします。その違いの理由は何でしょうか?私は純粋にリソース管理のためにARCに頼っています。私はクラッシュログを見て、それは参照していたメモリがすでに解放されたことを示しています。 ARCを使用すると、小売ビルドで問題を引き起こす可能性がある一般的な落とし穴は何ですか?

次はEDIT

Exception Type: EXC_BAD_ACCESS (SIGSEGV) 
Exception Codes: KERN_INVALID_ADDRESS at 0x6f636552 
Crashed Thread: 0 

私はクラッシュログから得たものである

アプリのデプロイメント・ターゲットは、iOS 5.0です。私はインターネット接続を使用していますが、現在のクラッシュはUITableViewControllerに表示するためにWebサービスから返されたデータを「レンダリング」するときに発生します。私がARCをオフにしているサードパーティのいくつかのソースファイルを除いて、アプリケーション全体がARCを使用しています。

+0

Plsは、より多くのヒントを提供します。展開ターゲットは、インターネットへの接続を使用していますか?すべてのクラスでARCを使用するのか、またはそれらのいくつかのみを使用しますか? – Andrea

+0

完了、上記の更新を参照してください – tom

+0

私はシムのゾンビ楽器を使用してアプリをテストする方が良いと思います。 ARCクラスと非ARCクラスを混在させるという事実は、委譲パターンや通知パターンを使っていくつか問題を引き起こす可能性があります。なぜデバイス上で起こっているのか、シム上で起こっているのか理解するのは難しいですが、おそらく2つのハードウェアの違いによるものです。 – Andrea

答えて

0

私は答えを持っていないかもしれませんが、私は、あなたがしようとするために、いくつかの勘をリストアップするつもりです:

  • をあなたがあなたの側でそれに「ハンドル」せずにメソッドにオブジェクトを渡していないことを確認してください。たとえば、デリゲートが必要なメソッドにハンドラクラスのインスタンスを渡します。メソッドはそのインスタンスを保持しないので、メソッドを呼び出す前に解放されます。
  • プリコンパイラのマクロは、DEBUG & RELEASEビルドで安全であることを確認してください。良い例としては、リリースビルドで削除されたマクロに対してifステートメントがあり、ifステートメントでは中括弧で囲まれていません。
  • コードの特定の部分(#if条件を使用して)を有効または無効にするコンパイラ定義に依存する場合は、ビルド構成に必要なものが設定されていることを確認してください。

私がもっと考えることができるなら、私はそれらを追加しようとします。

4

これが私に起こるときはいつも、リリースビルドが弱い参照をクリアするために積極的だからです。強く参照する前に弱いプロパティに間違って何かを割り当てると(例えば弱参照を保持するサブビューを追加している場合など)、デバッグに失敗してリリースで失敗する可能性があります。たとえば、(擬似コード)

@property (weak) UILabel * label; 
... 
self.label = [[UILabel alloc] init]; 
[self.view addSubview:self.label]; 
... 
self.label.text = @"hello"; 

これは、リリースビルドでの不正なアクセスがクラッシュし、デバッグ時に気付かないことが原因で発生します。

+0

はい、これは間違いなくクラッシュする可能性があり、間違いです。あなたは決して弱いrefを持ってはいけません。 –

0

リリースとデバッグのターゲットは異なりますか?すべてのファイルがリリースターゲットに対して正しく参照されているかどうかを確認します。

私たちの場合、UIButtonのカテゴリはリリース対象には見えませんでした。 ad-Hocビルドは、誰かがそのカテゴリで実装されたメソッドを呼び出すまでうまくいった。 Ad-Hocビルドのアーカイブは保存していなかったので、クラッシュをデバッグする方法はありませんでした。

クラッシュログにEXC_BAD_ACCESSと表示されているかどうかは不明ですが、リリース固有のクラッシュを特定するのに役立つ可能性があります。