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