コードのプロファイリングを行ったところ、自動解放されたオブジェクトでメソッドの 1 つがメモリ リークしていることをプロファイラーが示しています。関連するコードのスニペットを次に示します。
-(void) fillRSSEntriesDictionaryObject: (NSMutableDictionary *) dictionaryObject withAllRSSEntries: (NSArray *) allRSSEntries forKey: (NSString *) keyForRSSEntriesArchive {
RSSEntry *anRSSEntry;
NSArray *source;
NSMutableArray *episodes;
NSMutableArray *sourceArray = [[[NSMutableArray alloc] initWithObjects:nil] autorelease];
for (int i=0; i<[allRSSEntries count]; i++) {
source = [allRSSEntries objectAtIndex:i]; // grab the next source array.
episodes = [[[NSMutableArray alloc] initWithObjects:nil] autorelease]; // initialize the episodes array
for (int j=0; j<[source count]; j++) {
anRSSEntry = [source objectAtIndex:j];
NSDictionary *episodeDictionary = [NSDictionary dictionaryWithObjectsAndKeys:anRSSEntry.blogTitle, @"Blog Title",
anRSSEntry.articleTitle, @"Article Title", nil];
[episodes addObject:episodeDictionary]; // save the info for this episode
}
[sourceArray addObject:episodes];
}
// Finally, we need to create the key-value pair for the source array
[dictionaryObject setObject:sourceArray forKey: keyForRSSEntriesArchive];
}
ご覧のとおり、sourceArray と episodes のみが割り当てられたメモリであり、両方とも自動解放されます。episodes 配列が sourceArray 配列に追加されます。sourceArray は、呼び出し元に渡されるオブジェクトになります。
プロファイラーによって提供される特定の情報は、責任のあるライブラリが「foundation」であり、責任のある呼び出し元が +[NSDictionary (NSDictionary) newWithContentsOf:immutable] であるということです。これを展開すると、最終的にアプリが責任あるライブラリとして、このメソッドが責任ある呼び出し元として示されます。
これらは自動解放された配列であるため、プロファイラーがメモリ リークについて不平を言うのはなぜですか?