2011-10-13 14 views
7

ARCとカスタムdealloc関数で奇妙な問題をデバッグするのに少し時間を費やしました。XcodeとARCのデバッグに関する問題(deallocをスキップ)

  1. 私は操作が非常フラットオブジェクト(NO方法、自動アイバーズ、2つの強力な特性)の強い性質によって参照され、この動作のため
  2. を完了ブロックを設定
  3. NSOperationクラスをサブクラス化していこのオブジェクトを呼び出すことができますDataRequest
  4. すべてのガイドラインに従うと、完了ブロックはローカルオブジェクト(操作自体を含む)への弱い参照のみを使用します
  5. コンパイラもアナライザも
  6. DataRequestは、私が生成する操作のみを保持し、操作完了ブロックで破棄されます。いつも破壊されています(そのdeallocは常に実行されます)
  7. 私の操作はカスタムdeallocです。私はそれに単一のNSLogの呼び出しを持っています。

...と問題がある:私はデバッガで、この下を実行した場合、deallocを中にブレークポイントにヒットされることはありません

ログメッセージが表示されません。主に私は手術が漏れていると思った。

これを計測器で実行すると、システムコンソールがメッセージを出力し、Allocations計測器はカスタムdeallocを含む適切なスタックスナップショットから解放されたことを報告します。リークは検出されませんでした。

私はデバッグとプロファイリングに同じコンパイラ設定を使用していることを100%確信しています。最後に

最も混乱を招く事:私は[DataRequest dealloc]のカスタムバージョンを作成して、私はそれにself.operation = nil;を入れた場合 - すべてがさえデバッガから正常に動作します。

何人かのコンパイラリンカオプションがいくつかの違いを見てみるためにいくつかのヒントを持っていますか?これはアップルのツールのバグかもしれません(私たち全員が大きな魚を私たち自身のエラーのために責めていたのですか?)

...はい私はGDBとLLDBを試しました。結果は同じだった - 何が何かを示すかもしれない。

(実際に)私は、最小限のサンプルを作成しようとしましたが、それだけで働いていた

;あなたは)

おかげ

+0

私は非常に基本的な観察をしました...私がXCode(GDBまたはLLDB)からシミュレータでアプリケーションを実行すると、 'dealloc'のログメッセージは表示されません。デバッガを終了してシミュレータから直接起動すると、Console.appはすべてのメッセージを表示します。その間にはリンクがありません。奇妙な。私はデバッグセッションではXCodeからアプリを実行する場合 – simpleone

+0

...と一つにもより簡単結果は... - のdeallocが呼び出されていない私は、シミュレータで手動でアプリを実行してから、デバッガをアタッチた場合(印刷されていないログ)..すべてが期待通りです。 – simpleone

答えて

7

をNSZombiesEnabledていますか?私たちは同じ問題を抱えていて、NSZombiesを無効にして "解決"しました。

「製品」 - >「スキーム」 - >「編集スキーム」 - >「診断」 - >チェックを外しNSZombiesが有効になっているときにdeallocが呼び出されていない理由

は、私はよく分からない「ゾンビは、オブジェクトの有効化」 (私はそれがARCの前に呼ばれたと確信しています)。

+0

私はテストする必要がありますが、はい、NSZombiesEnabledを設定しました。これはかなり可能性があると思います。少なくとも、異なる行動については合理的な説明をしています。 – simpleone

+1

NSZombiesEnabledが原因であることを確認できます。どうもありがとう! – simpleone

+1

NSZombiesEnabledをARCとともに使用する場合、これはNSOperationだけでなく、すべての場所で発生します。 ARCでのdeallocのすごみを観察する場合重要なのは、(4 Xcodeで編集スキームに「有効ゾンビオブジェクト」をラベル付けされています...> [診断]タブ)NSZombiesEnabledを無効にすることです –

1

今日私は同じ種類の問題に遭遇しました。問題はプロジェクト設定で有効になっているNSZombiesが原因であることがわかりました。

私は、ARCの前にdeallocが呼び出されたことにも同意します。

iOS 5.x(デバイスまたはシミュレータ)を使用している場合、deallocは呼び出されないようです。

が、それは、この変更はios6にパッチが適用されているiOS5をのバグによって引き起こされている場合、私は知らない

のiOS 6.xの中(デバイスまたはシミュレータ)(ゾンビ有効にして)再び呼び出され、導入され、ロールバックされた機能。

私は今日、問題の同じ種類に走ったが、私の問題は、ブロックによって生成された保持サイクルだった...

0

に役立ちます願っています。

あなたはブロック使用している場合:

  1. をSELFは、ブロック内に表示されていないことを確認します。
  2. ブロック内でSELFを使用する必要がある場合は、弱参照を使用します。
  3. 自己(NSAssertなど)を参照しているマクロがブロック内にないことを確認してください。
関連する問題