1

仪器检测到内存泄漏:

(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,则不会发生这种泄漏,所以这对我来说很奇怪。

4

2 回答 2

0

在这一行

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

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

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

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

在此处输入图像描述

我假设你的意思是

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

这将导致一个自动释放的数组myArray

于 2012-12-19T06:26:25.260 回答
0

如果您不使用 ARC。

改变return myArray;_return [myArray autorelease];

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

于 2012-12-19T06:19:26.390 回答