xcode アナライザーを使用すると、オブジェクトの潜在的なリークに関する警告が表示されます。この警告はややこしいので、なぜこのエラーが発生するのか説明が必要です。問題のオブジェクトへのポインターを mediaSources が保持するコードを次に示します。
.h ファイルでは、MediaSources クラスへのポインターが作成され、retain プロパティが与えられます。
@interface RootViewController : UIViewController <...>
{
...
MediaSources *mediaSources;
...
}
@property (nonatomic, retain) MediaSources *mediaSources;
.m ファイル (rootViewController) には、何度も呼び出すことができるメソッドがあります。したがって、各エントリでオブジェクトを解放し、新しいオブジェクトを割り当てます。MediaSources オブジェクトはバックグラウンド タスクを実行するため、完了するまで解放したくありません。クラスが割り当てられている行で autoRelease を使用すると、クラッシュします。:
-(void) getSelectedMediaSources
{
[self setMediaSources: nil]; // release old stuff and nilify
[self setMediaSources: [[MediaSources alloc] init]];
[self.mediaSources checkForMediaSourceUpdates];
}
また、.m ファイルでは、mediaSources も合成され、dealloc で解放されます。
@synthesize mediaSources;
...
- (void)dealloc {
...
[mediaSources release];
...
[super dealloc];
}
この警告が表示される理由を説明してください。どうやって漏れがあるのか わかりません。Dealloc は、このオブジェクトの最後のコピーを解放する必要があります。
checkForMediaSourceUpdates からのコードのリクエストに応じて。少しややこしくなりますが、要点は以下の通りです。
(void) checkForMediaSourceUpdates
{
NSString *s = [NSString stringWithFormat:@"http://www.mywebsite.com/mediaSources/%@/mediaSources.plist", countryCode];
NSURL *url = [NSURL URLWithString:s];
NSURLRequest *req = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData timeoutInterval:60.0];
MyDownloader *d = [[MyDownloader alloc] initWithRequest:req];
[self.connections addObject:d];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(checkForMediaSourceUpdatesDownloadFinished:) name:@"connectionFinished" object:d];
[d.connection start];
[d release];
}
-(void) checkForMediaSourceUpdatesDownloadFinished: (NSNotification *) n
{
MyDownloader *d = [n object];
NSData *data = nil;
if ([n userInfo]) {
NSLog(@"In checkForMediaSourceUpdatesDownloadFinished: MyDownloader returned an error");
}
else {
data = [d receivedData];
// do something with the data
}
}
myDownloader クラスは、入力 NSURLRequest で指定されたファイルのダウンロードを実行します。ダウンロードが完了すると、このクラスは「connectionFinished」という名前の NSNotification を生成します。このクラスのユーザーは、この通知に登録し、このクラスのすべてのクリーンアップ操作を処理する必要があります。ダウンロードが失敗した場合、このクラスは「connectionFinished」という名前の NSNotification を生成しますが、エラーが発生したことを示す userInfo が追加されます。繰り返しになりますが、このクラスのユーザーは、この通知に登録し、このクラスのすべてのクリーンアップ操作を処理する必要があります。