セルが選択されると、ビュー コントローラーがナビゲーション スタックにプッシュされるテーブル ビューがあります。
SAPostTableViewController *postViewController = [[SAPostTableViewController alloc] initWithNibName:NSStringFromClass([SAPostTableViewController class]) bundle:nil];
postViewController.site = site;
[self.navigationController pushViewController:postViewController animated:YES];
[postViewController release];
SAPostTableViewController には静的な tableView があり、そのセルは nib からロードされます。
メソッドをオーバーライドしましたinitWithNibName:bundle:
:
-(id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {
self.sections = [NSMutableDictionary dictionary];
}
return self;
}
sections
保有物件です。
私はこれviewDidLoad
をSAPostTableViewController
持っています:
- (void)viewDidLoad
{
[super viewDidLoad];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(cellVisibiltyChanged:) name:@"SAStaticCellVisibiltyChanged" object:nil];
}
で一致するようにviewDidUnload
:
- (void)viewDidUnload
{
[super viewDidUnload];
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"SAStaticCellVisibiltyChanged" object:nil];
}
ただし、ナビゲーション バーの [戻る] ボタンを押して (すべて標準の動作で、オーバーライドなし)、ポップしても、 orSAPostTableViewController
は呼び出されません。つまり、プッシュするセルを再選択すると、新しいインスタンスが作成され、これを前後に繰り返すことは、ポップされたs が割り当て解除されないため、メモリ使用量が増加し続けることを意味します。(これは、割り当て時に Instruments を実行することでわかります)viewDidUnload
dealloc
SAPostTableViewController
SAPostTableViewController
SAPostTableViewController
奇妙なことに、SAPostTableViewController を 2 回リリースすると、期待どおりに動作します。
SAPostTableViewController *postViewController = [[SAPostTableViewController alloc] initWithNibName:NSStringFromClass([SAPostTableViewController class]) bundle:nil];
postViewController.site = site;
[self.navigationController pushViewController:postViewController animated:YES];
[postViewController release];
[postViewController release];
(3 つ目のリリース ステートメントを追加すると、2 つだけで期待どおりにクラッシュします)
すぐ上のコードの最初の行で実行されるコードの行を使用retainCount
してステップスルーしましたが、retainCount は 1 のままです。余分な時間を保持されていますか?
SAPostTableViewController はこの場所でのみ使用されます。これは何のデリゲートでもなく、デリゲートもありません。
どうすれば修正を見つけることができますか、それとも私が見逃した単純なものですか?
以下は、SAPPostTableViewController を 1 回だけ (リリース文を 1 つだけ) プッシュした後の Instruments の表示です。
そして、前後に繰り返しナビゲートした後に表示されるもの (ここでも、1 つのリリース ステートメント):