私の第1世代でテストするとき、私は本当に奇妙な問題を抱えています。iPad(iOS 5を実行)。
プロパティとして使用するUIViewがあります(保持あり)。親ビューのdeallocメソッドのプロパティをnilします。かなり基本的なもの。iOS6を実行しているiPad3で完璧に動作しますが、第1世代ではリリースされません。
何が起こっているのか考えてみませんか?
私はARCを使用していません。
私の第1世代でテストするとき、私は本当に奇妙な問題を抱えています。iPad(iOS 5を実行)。
プロパティとして使用するUIViewがあります(保持あり)。親ビューのdeallocメソッドのプロパティをnilします。かなり基本的なもの。iOS6を実行しているiPad3で完璧に動作しますが、第1世代ではリリースされません。
何が起こっているのか考えてみませんか?
私はARCを使用していません。
保持している場合は、解放する必要があります。インスタンス変数を単にnilにすることはできません。
したがって、プロパティが次のようになっている場合:
@property (nonatomic, retain) UIView *myView;
あなたはdeallocは次のようになります:
- (void)dealloc
{
[myView release], myView = nil;
[super dealloc];
}
またはこれ:
- (void)dealloc
{
[self setMyView:nil];
[super dealloc];
}
またはこれ:
- (void)dealloc
{
self.myView = nil;
[super dealloc];
}
そして、他の何かがそれを保持していない限り、あなたの財産は適切に解放されます。
だから私はこれを理解しました。iOS 6 SDKのバグのようですが、理解できないかもしれません。presentViewController:animated:completionを介して別のvcを提示するUIViewControllerがあります。—提示されたvcを閉じると、解放され、その後、すべてのサブビューが削除され、すべてが正常になります。
ただし、提示されたvcが表示されているときに、親vcを削除/破棄すると、提示されたvcの割り当てが解除されますが、そのサブビューはremoveFromSuperviewに指示されません。これは機器のリークとしては表示されませんが、サブビューの割り当てを解除することはできません。
これはiOS6では発生しないため、これはiOS5のバグであると思われます。iOS6で予想されるように、すべてがリリース/割り当て解除されます。
誰かが説明を持っているか、これをよりよく理解しているなら、私は私ではなく彼らに答えを与えたいと思います。
ビューコントローラは、ビューコントローラの割り当てが解除されたときに、スーパービューからそのビューを削除する責任を負いません。ビューコントローラは、それへの独自の参照を解放する責任があります。
例:ビューコントローラーを作成し、そのビューを要求してから、そのビューを別のビューに追加して、ビューコントローラーを破棄できます。その場合は、ViewControllerをViewBuilderとして使用しているだけです。
iOS 6で動作が異なる理由はわかりませんが、知りたいと思います。