2

コードのプロファイリングを行ったところ、自動解放されたオブジェクトでメソッドの 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] であるということです。これを展開すると、最終的にアプリが責任あるライブラリとして、このメソッドが責任ある呼び出し元として示されます。

これらは自動解放された配列であるため、プロファイラーがメモリ リークについて不平を言うのはなぜですか?

4

1 に答える 1

1

ここに漏れはありません。ほとんどの場合、後で他のコードがこれらのオブジェクトを使用してリークします。

Instruments を使用して、リークされたオブジェクトの保持/解放履歴を確認できます。これは、余分な保持または不足している解放を見つけるのに役立ちます。

于 2013-09-06T22:50:49.177 に答える