仪器检测到内存泄漏:
(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
,那么这个泄漏就不会发生,所以这对我来说很奇怪。
答案 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静态分析器也将此报告为错误:
我认为你的意思是
myArray = [[[NSArray alloc] initWithArray:[context executeFetchRequest:fetchRequest error:&error]] autorelease];
会导致自动释放的数组myArray
。