这个函数是否会产生任何内存泄漏?

时间:2012-12-12 12:20:24

标签: objective-c memory-management memory-leaks instruments

+ (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];
}

我想问一下,这个功能是否会泄漏内存?实际上乐器说这个功能正在泄漏地狱。

请帮我解决内存问题?

2 个答案:

答案 0 :(得分:1)

如果您需要查看对象使用仪器的保留,释放和自动释放的位置:

在仪器中运行,在分配中设置“记录参考计数”(您必须停止记录以设置选项)。导致问题代码运行,停止记录,搜索感兴趣的ivar,向下钻取,您将能够看到所有保留,释放和自动释放发生的位置。

enter image description here

以下是使用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;
}

答案 1 :(得分:0)

为什么[_fetchError release];存在?

你为什么不使用ARC?

尝试将此代码重构为AR​​C。