ビューに追加した後、サブビューのretainCountをチェックしています。コードは次のとおりです。
- (void) loadView{
//...
toolbar = [[UIToolbar alloc] initWithFrame:nil];
[[self view] addSubView:toolbar];
}
- (void) dealloc{
NSLog(@"count=%d", [toolbar retainCount]); // count=2
[toolbar removeFromSuperView];
NSLog(@"count=%d", [toolbar retainCount]); // count=1
[toolbar release]
NSLog(@"count=%d", [toolbar retainCount]); // count=1
toolbar = nil;
NSLog(@"count=%d", [toolbar retainCount]); // count=0
}
dealloc{} のこのコードから、いくつか質問があります。
1、ツール バーの最初のログの保持カウントは 2 です。初期化後にツール バーがセルフ ビューに追加されるため、保持カウントは 2 になります。
2、ツールバーの removeFromSuperView の後、retainCount は 1 になります。
3、ツールバーが release メソッドを呼び出した後、retainCount は 1 のままで、0 になることはありません。 0.
4, nil に設定されたツールバーを呼び出すと、retainCount は 0 になります。このログは役に立ちません。
私の質問は次のとおりです。
a) ツールバーは removeFromSuperView とリリース API を呼び出しますが、結果は同じで、ツールバーのretainCount は 1 になるだけです。そのため、それぞれを使用するだけでコードをテストすると、結果は同じになります。では、ユーザーはそれぞれ 1 つの API しか呼び出すことができなくても問題ないと結論付けることができますか?
b)Apple ドキュメントから、セルフ ビューにサブビューが追加され、セルフ ビューはツールバー ハンドルのままであるため、dealloc メソッドでは、viewDidUnload が呼び出されない場合、ツールバーのretainCount を 0 に減らすことはできません。メモリが不足している場合、システムは不要なビューを減らして viewDidUnload メソッドを呼び出し、ツールバーのretainCountを自動的に0に減らします。したがって、deallocメソッドでツールバーをnilに設定する必要があります。ツールバーを nil に設定すると混乱します。viewDidUnload メソッドが呼び出されると、ツールバーが縮小されますか? メモリリークはありますか?
どうも。