UITableviewcontroller (DOArticleListViewController) をロードするナビゲーション コントローラーがあります。
- (void) showList: (NSFetchedResultsController*) list title:(NSString*) title {
DOArticleListViewController* listView = [[[self navigationController] storyboard] instantiateViewControllerWithIdentifier:@"DOArticleListViewController"];
[listView setObjects:list];
[listView setViewTitle:title];
[[self navigationController] pushViewController:listView animated:YES];
}
DOArticleListViewController の [戻る] ボタンをタップすると、ビューが解放されず (dealloc/viewDidUnload がない)、前後に移動するたびにメモリ使用量が増加します。
何が原因ですか、または強制的にリリースするにはどうすればよいですか? 最近ARCに引っ越したばかりなので、「NSFetchedResultsController」と関係があるかもしれません。
TableViewController の宣言は次のとおりです。
@interface DOPrototypeListViewController : DOPrototypeViewController <NSFetchedResultsControllerDelegate, UITableViewDelegate> {
IBOutlet UITableView * _tableView;
int _cellHeight;
@protected
NSFetchedResultsController* _objects;
NSString* _cellIdentifier;
bool _commonId;
int _sectionItemsSkipped;
}
@property (nonatomic, strong) UITableView *tableView;
@property (nonatomic, strong) NSFetchedResultsController* objects;
- (NSIndexPath*)calculateObjectIndexPath:(NSIndexPath*) indexPath;
- (NSIndexPath*)calculateTableIndexPath:(NSIndexPath*) indexPath;
@end
リストを強力として宣言しましたが、それを弱くしたかのように、後続のdetailViewControllerに移動するときにオブジェクトを探しているときにNSFetchedResultsControllerがアンロードされます。
編集: プロファイリングではオブジェクトがリリースされていないように見えるため、より根本的な問題があると思います。保持カウントが 0 の場合でも、オブジェクトはメモリに残っているように見えます。夏に ARC に引っ越し、自動変換を行いました。オブジェクトが保持され、解放/解放されない原因となる単純な根本的な欠陥がどこかにあるのではないかと思います。
クラス自体でインスタンス化されたオブジェクトは nil に設定されますか? たとえば、これをnilに設定する必要がありますか:
_mediaPlayerHelper = [[DOMediaPlayerHelper alloc] init:self];
ARCの前はそうしていたでしょうが、今ではビューコントローラーがビュースタックから削除されたときに呼び出される関数がありません(削除することはできますが、これはゴングが詳細ビュー コントローラー)。