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,向下钻取,您将能够看到所有保留、释放和自动释放发生的位置。

在此处输入图像描述

这是使用 ARC for iOS 4.3 及更高版本的简化版本:

+ (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 回答