2017-07-25 2 views
13

私はプロジェクトのXcodeメモリグラフツールを見ていて、奇妙な動作に気付いていました。誰かを願って、何が起こっているのかを説明することができるかもしれません。リリースされたオブジェクトを示すXcodeのデバッグメモリのグラフ

2つのオブジェクトを作成するビューコントローラがあります(現在はあまり効果がありません)。ビューコントローラを無効にすると、十分に解放されます。しかし、1(時には両方)は、ビジュアルデバッガでたむろするように見える:

enter image description here

2つだけは、今まで作成されている、との両方が私の卓で確認、deinitializedされています:

enter image description here

私は上記の画像のUserオブジェクトを参照しているオブジェクトについては責任を負いませんので、これはバグですか、それとも私が心配する必要がないものですか?

+0

この問題は引き続き発生していますか? –

答えて

0

オブジェクトのdeinitメソッドから「リリースされたユーザー」が記録されましたか?もしそうなら、オブジェクトは初期化されていませんでしたので、参照が何であれ、オブジェクトを生かし続けることができませんでした。それを考えると、私はおそらくそれについて心配しないでしょう。確かめたいのは、インストゥルメントを起動し、アロケーションツールをロードし、RunボタンをOption-クリックして、 "Reference reference count "これにより、オブジェクトの保持と解放を正確に確認することができます。

1

説明されたグラフのオブジェクト(Userオブジェクトを保持しているオブジェクト)のいずれにも責任がない場合は、それを心配する必要はありません。

FYI:アプリケーションにFirebaseを含める前にリークを経験しました。それはあなたのせいではなく、たくさんの記憶を漏らしてはいけません。

私は@CharlesSrstkaに同意します。まだ漏れが心配されている場合は、問題の原因となっている可能性のある特定のコード行が表示される計測器でチェックすることができます。

+0

これをgoogleservice-info.plistに追加してください FIREBASE_ANALYTICS_COLLECTION_ENABLED = NO これはおそらくリークを減らすでしょう –

0

これはあなたに起こっているのかどうかはわかりませんが、これが私に起こり、Swiftの内部メモリモデルの結果であることが判明しました。

これを適用するには、Userオブジェクトに対する弱いまたは所有されていない参照が必要です。

この場合、オブジェクトに対する最後の強い参照が削除されると、オブジェクトは初期化されません。参照するオブジェクトは参照カウントを減らし、必要に応じて割り当てを解除し、deinit()メソッドを(あなたのログに示されているように)実行します。ただし、は割り当て解除されません。

はい、オブジェクトは非初期化できますが、割り当て解除されません。その理由は、このオブジェクトを指す弱いまたは所有されていない参照は、このポインタの後に「安全でない」動作を生成するため、解放された(または悪化した、再割り当てされた)メモリを指すことを許されてはならないからです。その結果、メモリのこのセクションは放棄することができず、オブジェクトは割り当て解除されません。

ただし、2つの良いニュースです。最初に、その特定のオブジェクトだけがリークされます - 参照するオブジェクトのいずれもリークされません。これは、ほんの少しのメモリしか漏れていないことを意味します。だから大したことではないかもしれません。第2に、弱い参照の場合、Swift 4ではこの動作が変更されています(残念ながら未所有の参照にはこの動作があります)。Xcode9ベータ版でプロジェクトを試してみて、それがまだ起こっているかどうかを確認するのは面白いでしょう。

これは、WWDCの同じ種類の質問をしているからです。それが適用可能になることを願って!

+0

洞察力のある返信ありがとうございます。この場合、私は弱いまたは無所属の参照が保持されているとは思わない。私は実際にこの例題が動作を複製するために、最後に完全に空のプロジェクトを作成しました。プロジェクトにあったのは、基本的に空の 'User'クラスと' ViewController'でした。これらの結果に終わった。とにかくありがとうございます。 –

関連する問題