0
+ (NSArray *) fetchAllContactsInContext:(NSManagedObjectContext *)a_context
{
    NSFetchRequest *_request = [[NSFetchRequest alloc] init];
    [_request setEntity:[NSEntityDescription entityForName:@"Contact" inManagedObjectContext:a_context]];

    NSSortDescriptor *_sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"lastName" ascending:YES];
    NSArray *_sortDescriptors = [[NSArray alloc] initWithObjects:_sortDescriptor, nil];
    [_request setSortDescriptors:_sortDescriptors];

    NSError *_fetchError=nil;
    NSArray *_results = [[NSArray alloc] initWithArray:[a_context executeFetchRequest:_request error:&_fetchError]];
    [_sortDescriptor release];
    [_sortDescriptors release];
    [_request release];

    if (_fetchError){
        NSLog(@"Contact - Error fetching contacts %@", [_fetchError localizedDescription]);
    }
    [_fetchError release];
    return [_results autorelease];
}

聞きたいのですが、この関数はメモリをリークしていますか? 実際、Instruments は、この関数が大量のメモリをリークしていると言っています。

メモリの問題を解決するのを手伝ってくれませんか?

4

2 に答える 2

1

オブジェクトの保持、解放、および自動解放が発生する場所を確認する必要がある場合は、インストゥルメントを使用します。

計測器で実行し、割り当てで「参照カウントの記録」をオンに設定します (オプションを設定するには、記録を停止する必要があります)。問題のコードを実行し、記録を停止し、関心のある ivar を検索し、ドリルダウンすると、すべての保持、解放、および自動解放が発生した場所を確認できます。

ここに画像の説明を入力

これは、iOS 4.3 以降の ARC を使用した単純化されたバージョンです。

+ (NSArray *) fetchAllContactsInContext:(NSManagedObjectContext *)aContext {
    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Contact"];

    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"lastName" ascending:YES];
    [request setSortDescriptors:@[sortDescriptor]];

    NSError *fetchError;
    NSArray *results = [aContext executeFetchRequest:request error:&fetchError];

    if (results == nil){
        NSLog(@"Contact - Error fetching contacts %@", [fetchError localizedDescription]);
    }
    return results;
}
于 2012-12-12T12:30:18.967 に答える
0

なぜ[_fetchError release];あるのですか?

そして、なぜARCを使わないのですか?

このコードを ARC にリファクタリングしてみてください。

于 2012-12-12T12:30:07.813 に答える