loadNibNamedのメモリリーク?
-
22-07-2019 - |
質問
最初のiPhoneアプリを完成させようとしていますが、Leaks Performance Toolを使って実行することにしました。明らかな1つを修正した後、私が残したものは、loadNibNamedを介して読み込まれたテーブルヘッダービューとして機能するNibを持つものだけです(ここでRecipesデモをフォローしていました)。
- (void)viewDidLoad {
[super viewDidLoad];
if (self.tableHeaderView == nil) {
[[NSBundle mainBundle] loadNibNamed:@"TableHeaderView" owner:self options:nil];
self.tableView.tableHeaderView = self.tableHeaderView;
}
}
次にdeallocで:
- (void)dealloc {
[tableHeaderView release];
[super dealloc];
}
Instrumentsは、loadNibNamedの行から2つのリークが発生している256バイトをリークしていることを示しています。 tableHeaderViewは、Nibで唯一の最上位オブジェクトです(デバッガーで確認しました)。リリースするのを忘れているものはありますか? Instrumentsが私に言っていることを間違って解釈していますか?違いますか? OSが後でクリーンアップするものですか?
解決
Instrumentsはこれをシミュレータでのみ通知していますか、それとも実際のデバイスで同じことを報告していますか?デバイスで取得できない場合、それはシミュレーターです-そして、それは起こることが知られています(完全の一致ではありません)。
また、deallocでダウンすると、 [self.tableHeaderView release]
になりませんか?使用法と一貫している必要があります。
混乱を避けるために、.hで次のように宣言します:
NS/UI/??xxxxxx *_MyObjectName; //notice the underscore
次のようなプロパティ:
@property .... NS/UI/??xxxxxx *MyObjectName; //no underscore
次に、次のようにゲッター/セッターを合成します:
@synthesize MyObjectName=_MyObjectName;
最後に、プログラム全体で [self.MyObjectName ...];
他のヒント
nibをロードするときは、nibファイル内のすべての最上位オブジェクトを解放する必要があります。そのファイルには、TableHeaderView以外に何かありますか?