7

ARCとカスタムdealloc関数の奇妙な問題のデバッグに時間を費やしました。

  1. 私はクラスをサブクラス化していNSOperationます
  2. この操作の完了ブロックを設定しました
  3. 操作は、非常にフラットなオブジェクトの強力なプロパティ(メソッドなし、自動ivar、2つの強力なプロパティ)によって参照され、このオブジェクトを呼び出すことができますDataRequest
  4. すべてのガイドラインに従って、完了ブロックはローカルオブジェクト(操作自体を含む)への弱参照のみを使用します
  5. コンパイラもアナライザも問題を生成しません
  6. DataRequest私が生成した操作への唯一の参照を保持し、操作完了ブロックで破棄されます。それは常に破壊されます(dealloc常に実行されます)
  7. 私の操作にはカスタムがありますdealloc。NSLog呼び出しは1つだけです。

...そして問題は:

これをデバッガーで実行すると、deallocのブレークポイントに到達することはなく、ログメッセージが表示されることもありません。主に操作が漏れていると思いました。

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

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

最後に最も紛らわしいのは、のカスタムバージョンを作成してそれ[DataRequest dealloc]に入れself.operation = nil;た場合、デバッガーからでもすべて正常に機能することです。

誰かがいくつかの違いを見ようとするコンパイラリンカーオプションのヒントを持っていますか?これはAppleツールのバグである可能性があります(私たち全員が自分たちのエラーのせいで大きな魚を非難する立場にありましたよね?)

...そしてはい、GDBとLLDBで試しました。結果は同じでした-何かを示している可能性があります。

ミニマルなサンプルを作成しようとしましたが、うまくいきました(実際);)

ありがとう

4

3 に答える 3

7

NSZombiesEnabledはありますか?同じ問題が発生し、NSZombiesを無効にすることで「解決」しました。

「製品」->「スキーム」->「スキームの編集」->「診断」->「ゾンビオブジェクトを有効にする」のチェックを外します

NSZombiesが有効になっているときにdeallocが呼び出されない理由はわかりません(ARCより前に呼び出されたと確信しています)。

于 2011-10-21T21:43:13.790 に答える
1

今日同じ種類の問題が発生し、プロジェクト設定で有効になっているNSZombiesが原因で問題が発生していることを確認するのに約5時間かかりました。

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

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

ただし、iOS 6.x(デバイスまたはシミュレーター)で(ゾンビを有効にして)再度呼び出されます

この変更が、ios6でパッチが適用されたios5のバグによるものなのか、それとも導入されてロールバックされた機能によるものなのかはわかりません。

お役に立てば幸いです...

于 2013-02-15T16:48:52.150 に答える
1

今日も同じような問題が発生しましたが、問題はブロックによって生成された保持サイクルでした。

ブロックを使用している場合:

  1. SELFがブロック内に表示されないようにしてください。
  2. ブロック内でSELFを使用する必要がある場合は、弱参照を使用してください。
  3. ブロック内に自己を参照している可能性のあるマクロ(NSAssertなど)がないことを確認してください。
于 2014-03-29T00:29:38.987 に答える