2016-09-19 6 views
1

Xcode 8とSwift 2.3の割り当てツールで奇妙な動作が見られます。私はdeinitが呼び出されているオブジェクト(A)を持っていますが、A参照が割り当て解除されているオブジェクトの1つを除いてすべて(別のメモリの問題です)、オブジェクトは継続します割当制度に「生きて」永続的に記載されるべきである。私はそれが保持していますデバッグしようとすると、さらに、私が見るすべては次のとおりです。まだオブジェクトが呼び出されていますが、オブジェクトがまだメモリにあります

  • がdeinitメソッドへの印刷行を追加:私はdeinitを確認しました

    enter image description here

    注によって実行されています

  • deinitメソッドにブレークポイントを追加する
  • A参照が割り当て解除され、A.__deallocating_deinitの内部で発生すると主張するリリース(-1)参照カウントを受け取ることを確認します。方法

しかし、いくつかの未知の理由のために、それは固執するように見えます。

+0

本当に、そのオブジェクトの他の参照はありませんか? ARCごとに、オブジェクトは参照カウントが0になるまでオブジェクトの割り当てが解除されません。そのビューの参照を他の場所(他のVC)で保持しているかもしれません。 – Janmenjaya

+1

deinitが呼び出されて(返された)場合、オブジェクトが参照されているかどうかにかかわらず、オブジェクトはほぼ確実になくなります。通常、この種の問題が発生している場合は、期待していないオブジェクトの2番目のコピーがあります。 (「期待していなかった2番目のコピーがあります」というのは、実際には不可能な一見不可能な行動の原因です)。メモリアドレスを確認してください。しかし、私が探しているもう1つのことは、あなたが誤ってオブジェクトを「deinit」に保持しているかどうかです。それは混乱にあなたを得ることができます(しかし、おそらく*おそらく*この症状を引き起こさない;私は余分なコピーを賭けている)。 –

+0

@RobNapier実際に作成されるオブジェクトは1つだけであることを確認しました。 'deinit'が実行されていて、まだオブジェクトを解放していませんでした。私はまだこの問題が起こった理由の100%を理解していませんが、私は最終的に私の問題を解決した答えを以下に加えました。 –

答えて

1

検索の数時間後、私はついに(ほとんど)それを理解することができました。

この場合、6つのプロパティを持つクラスAがあります。そのうちの1つはクラスBのインスタンスです。クラスAはクラスBのブロックコールバックを登録します。クラスBはメインループの外側から@autoreleasepoolで適切にラップされていなかったNSThreadを分離します。その結果、クラスBは意図した以上に長く保持されていたため、Aへのコールバックが意図したよりも長く保持されていました。

クラスAが[unowned self]ですべてのブロックを登録したため、「ほとんど」と考えられたのはその理由です。まだ未知の理由のために、それはdeinitが実行されるのに十分であるように思えましたが、実際にオブジェクトを解放するのに十分ではありません。 @autoreleasepool内の他のスレッドをラップすると、アプリはBをリリースすることができました.Aを解放するには十分でした。

+0

私はこの答えをチェックしないままにして、この回答に基づいて誰かが実際に問題を解決する「最良の」解決策を特定できるかどうかを確認します。 –

関連する問題