2010-11-28 9 views
1

(または1つのデリゲートを持つ1つのクラスでさえ)同じデリゲートを持つ複数のクラスをリリースするにはどうすればよいですか?

私はDataGetterという名前のクラスがあります。このクラスはWebからファイルをダウンロードします。これは、ファイルがダウンロードされたときにトリガされますデリゲートメソッドを、持っている:

- (void) dataGetterFinished:(DataGetter *)dataGetter; 

だから、somehere私のコードでは、私はそうのようにダウンロードするために、いくつかのファイルを設定することができます

打ち鳴らすの静的を使用して
// in AViewController.m 
DataGetter *blueFile = [[DataGetter alloc] init]; 
blueFile.delegate = self; 
[blueFile getData:@"http://example.com/blue-file"]; 

DataGetter *redFile = [[DataGetter alloc] init]; 
redFile.delegate = self; 
[redFile getData:@"http://example.com/red-file"]; 

アナライザでは、上の各alloc行は、 '行に割り当てられたオブジェクトの潜在的なリーク...'エラーを取得します。だから私はどのようにオブジェクトをリリースするだろう。デリゲートがあるため、ハングアップする必要があります。だから、そう

- (void) dataGetterFinished:(DataGetter *)dataGetter 
{ 
// code 
[dateGetter release]; 
} 

のように、dataGetterFinishedメソッドの最後の行としてそれを解放するためにOKです...または私は何とかにautoreleaseを使用すべきですか?

答えて

1

技術的にはうまくいきますが、NSMutableArray内のさまざまなDataGettersを追跡することをお勧めします。例えば

DataGetter *blueFile = [[DataGetter alloc] init]; 
blueFile.delegate = self; 
[blueFile getData:@"http://example.com/blue-file"]; 
[dataGetters addObject:blueFile]; // dataGetters is an NSMutableArray declared in the .h 
[blueFile release]; 

// Same for red 

そして、デリゲートメソッドでは、単純な配列からゲッターを削除:

- (void) dataGetterFinished:(DataGetter *)dataGetter 
{ 
// code 
[dataGetters removeObject:dataGetter]; 
} 

配列はオブジェクトを保持の世話をし、あなたが得ることはありません分析の警告。

deallocメソッドで必ずdataGettersを解放してください。

+0

ありがとう!デリゲートメソッドでクラスを解放するのではなく、NSMutableArrayを使用する利点は何ですか?それは単にclangの神々を喜ばせることですか? – cannyboy

+1

そうだと思いますが、後でdataGettersにアクセスしたい場合は、配列を調べるだけです。私はいつも、それをやるよりずっとやさしい方法だと感じました。 –

関連する問題