2012-04-01 11 views
0

私のアプリケーションでは、複数の理由でここで作成する必要があるため、viewDidAppearでテーブルビューを作成しています。しかし、アプリケーションを分析するとメモリリークが発生することに気付きました。ViewDidAppearでテーブルビューを作成

私はインスタンス変数_tableViewを使用して、initとdealloc以外の他の方法では良い考えではないと思った。私はちょうどオートリリースを使用する必要があります、私はテーブルが適切な時点でリリースされることを確認したい。

私のテーブルビューにはプロパティがあります。

@property (nonatomic, retain) UITableView *tableView; 

は、と私は、次のようなテーブルビューを作成します。

- (void)viewDidAppear:(BOOL)animated 
{ 
    self.tableView = [[UITableView alloc] 
         initWithFrame:CGRectMake(0, 0, 320, 300) 
         style:UITableViewStyleGrouped]; 

    // Table View properties 
    self.tableView.dataSource = self; 
    self.tableView.delegate = self; 

    [self.view addSubview:self.tableView]; 
} 

- (void)viewDidDisappear:(BOOL)animated 
{ 
    self.tableView = nil; 
} 

- (void)dealloc 
{ 
    [_tableView release]; 
} 
+0

deallocでは、[self.tableView release]とself.tableView = nilを使用する必要があります。あなたは安全です。 –

答えて

1

自動解放を。あなたはallocのための1つの保持とプロパティの代入のためのもう1つを取得します(それは保持されたプロパティであると仮定します)。

あなたのdeallocは1つを処理し、もう一方はautoreleaseを処理する必要があります。

+0

したがって、自動解放し、[_tableView release]をdeallocに設定しますか? – Vikings

+0

はい。製品 - >分析メニューオプションは、この種のものを捕まえるための良いツールです。それは、作成された場所と参照が範囲外になる可能性がある、漏れた可能性が高いオブジェクトを示します。 (実際には、あなたのviewDidDisappearはdeallocのリリースを[無リリース]にするかもしれませんが、無意味ですが損害はありません) –

0

設定プロパティを使用すると、別のクラスでその変数を使用したいとき、私は

あなたがviewDidAppearで作成しているので、それはときビューは常に作成され、それ以外の場合は必要ありませんが、インスタンス変数のプロパティを設定して良いですそのコントローラに表示されるので、ViewDidDisappearメソッドでテーブルビューをよりよく再描画します。

あなたが自動解放を使用している場合、我々は文句を言わない、テーブルビューにアクセスして、いくつかの回は、アプリケーションのクラッシュの原因となりますので、発売されます取得し、

0

他の人が言っているものの上に、私は中allocをやってからあなたを阻むだろうviewDidAppearこのメソッドは、他に何が起こっているかに応じて何度も呼び出すことができます(そして、allocの前にtableViewの存在をチェックしない限り、リークが発生します)。 viewDidLoadで行う方がはるかに安全であるようです。

脇に、あなたのviewDidAppearviewDidDisappeardeallocはともにsuperのバージョンであることが必要です。

+0

私は[super ...]でコピーしませんでしたが、ビュー階層が完了し、viewDidLoadが常に呼び出されるわけではないので、これを試みている理由がviewDidAppearです。 – Vikings

+0

私がviewDidDisapearでリリースした場合、私が割り当てる前にif(self.tableView == nil)が必要ですか? viewDidAppearが呼び出される前に、常にゼロにならないでしょうか? – Vikings

+0

(1)viewDidDisAppearのallocとviewDidDisAppearのリリースとのバランスをとると、それはおそらく問題ありません。 – Rob

2

self.tableViewretainプロパティなので、合成されたセッターは保持カウントを増加させます。しかし、alloc/initを使用して新しいUITableViewを作成すると、保持カウントも増加します。あなたがself.tableView =を用いて合成セッターを呼び出すときに一度

一度
self.tableView = [[UITableView alloc] 
        initWithFrame:CGRectMake(0, 0, 320, 300) 
        style:UITableViewStyleGrouped]; 

あなたはalloc/initを使用し、そして:だからtableViewこの行の結果が二度保持されています。

対応する2つのコールがありません。release

これを処理する適切な方法は、autoreleasealloc/initになります「あなたがself.tableViewを設定するのUITableViewオブジェクトをD、そのよう:予想通り

self.tableView = [[[UITableView alloc] 
        initWithFrame:CGRectMake(0, 0, 320, 300) 
        style:UITableViewStyleGrouped] 
        autorelease]; 

あなたのコードの残りの部分は動作します。

脇に、viewDidAppearUITableViewを作成しないことをお勧めします。その時までにあなたの意見は既に現れています(したがって名前)。あなたはその前にあなたのUITableViewを望んでいた可能性があります。また、ビューが表示されるたびに新しいUITableViewを作成するCPUの費用を掛けたくはないでしょう。本当に良い理由がない限り、UITableViewviewDidLoadに作成してから再利用することをお勧めします。

関連する問題