核心数据奇怪的内存泄漏

时间:2012-12-19 06:15:43

标签: iphone core-data memory-leaks instruments

仪器检测到内存泄漏:

(Leaked Object= "__NSCFString")

这是我的代码:

-(NSArray*)loadAllPages{
    NSManagedObjectContext *context = [self managedObjectContext];
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription
                                   entityForName:@"Page" inManagedObjectContext:context];
    [fetchRequest setEntity:entity];
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc]
                                        initWithKey:@"date" ascending:YES];
    [fetchRequest setSortDescriptors:[NSArray arrayWithObject:sortDescriptor]];
    [sortDescriptor release];

    NSError *error = nil;
    myArray = [[NSArray alloc ]initWithArray:[[context executeFetchRequest:fetchRequest error:&error]autorelease]];

    [fetchRequest release];
    if (myArray == nil)
        NSLog(@"%@",error);
    return myArray;
}

指向泄漏的行是myArray的初始化。 如果我没有返回myArray,那么这个泄漏就不会发生,所以这对我来说很奇怪。

2 个答案:

答案 0 :(得分:0)

如果您不使用ARC。

使用return myArray;

更改return [myArray autorelease];

您正在从方法返回一个已分配的对象,该对象的所有权仍然使用该方法,在这种情况下,您应该返回一个非对象的对象并将其保留在接收方。然后该对象的所有权将使用调用方法。

答案 1 :(得分:0)

在这一行

myArray = [[NSArray alloc ]initWithArray:[[context executeFetchRequest:fetchRequest error:&error]autorelease]];

方括号略有错误。 autorelease将发送到[context executeFetchRequest:...]的结果,而不是已分配的数组。

[context executeFetchRequest:...]返回一个自动释放的数组。向该数组发送autorelease是一个错误。 myArray已分配,但未在您的代码中发布。

Xcode静态分析器也将此报告为错误:

enter image description here

我认为你的意思是

myArray = [[[NSArray alloc] initWithArray:[context executeFetchRequest:fetchRequest error:&error]] autorelease];

会导致自动释放的数组myArray