2

Xcode (Allocations) のプロファイリング ツールを使用して見つけたのは、プロパティを nil アウトすると、親クラスが nil アウトされるまで割り当てが解除されないことです。ここで、高価なモーダル ビュー コントローラーをメモリに保持しないようにしたいとします (頻繁に使用されることはないと仮定して)。高価な VC がプロパティである場合、そのプロパティに割り当てられたメモリはつまり、ユーザーが高価な VC を再度使用したい場合、毎回同じ量のメモリを割り当てることになります。これは、グラフが上昇し続けるため、プロファイラーで簡単に見つけることができます。

ただし、高価な VC のみをインスタンス変数として定義し、独自のセッターとゲッターを定義すると、プロファイラーの割り当てグラフは、変数が空になるとすぐに減少し、新しい割り当てごとに同じ量で元に戻ります。

だから私の質問は、変数がインスタンス変数として定義されたときに解放されたように見えるのに、プロパティとして定義されたときには解放されないのはなぜですか?

// What I call defining something as an instance variable:
@interface SomeViewController ()
{
    UIPopoverController *somePopover;
}

// What I call defining something as a property
@property (nonatomic,strong) UIPopoverController *somePopover;

// Nilling out a property which does not get allocated unless it does not have a parent (root node memory graph wise)
self.somePopover = nil;

// Nilling out an instance variable which does make the memory graph in the profiler go down by the same amount it went up
somePopover = nil;

私の知る限り、親が割り当て解除を呼び出し、そのすべての子がカスケード割り当て解除されるまで、オブジェクトにすべてのメモリを強制的に解放することはできません

4

2 に答える 2

6

あなたの分析は正しくないと思います。適切に使用すると、プロパティとインスタンス変数の両方が参照カウントに同じ効果をもたらします。nilに設定すると参照カウンターが減少し、0 になると、インスタンス (ビュー コントローラーなど) はすぐに割り当て解除されます。

アプリでこれが当てはまらない場合、原因はプロパティとインスタンス変数以外にあるはずです。

特定の問題をさらに分析するには、さらに情報が必要です。したがって、コードを投稿し、メモリ管理効果を測定するための設定、効果的な結果とは何か、代わりに何を期待するかを説明してください。

于 2013-09-07T11:57:27.453 に答える