2010-07-10 90 views
0

当我向核心数据中的提取请求添加排序描述符时,出现内存泄漏。如果我注释掉NSSortDescriptor块,它将在Instruments中没有内存泄漏的情况下运行。导致内存泄漏的核心数据NSSortDescriptor

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Pools" inManagedObjectContext:self.managedObjectContext]; 
[fetchRequest setEntity:entity]; 

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"game.league.id=%i",[lid intValue]]; 
[fetchRequest setPredicate:predicate]; 

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"game.date" ascending:YES]; 
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil]; 
[fetchRequest setSortDescriptors:sortDescriptors]; 
[sortDescriptors release]; 
[sortDescriptor release]; 

NSError *error; 
NSArray *items = [managedObjectContext executeFetchRequest:fetchRequest error:&error]; 

// Do Something 

[fetchRequest release]; 
[items release]; 

任何想法?

回答

1

在排序描述符中,您正在使用关键路径game.date进行关系。

您的泄漏可能与关键路径中的其中一个对象相关联。当您移除排序时它会消失,因为那样关键路径中的对象不会执行任何操作。

如果你有瞬态属性,自定义访问器,非实体属性等在game实体我会看看那里。自定义值变换器也是一个不错的选择。

仪器中的堆栈应该告诉您确切的哪个对象正在泄漏。

+0

那里没有任何自定义代码。核心数据堆栈可能是错误的? – 2010-07-13 13:07:18

+0

不太可能。为什么会出现泄漏,而不是您设置Core Data堆栈的位置?乐器会告诉你什么在泄漏。将此源文件拖放到乐器中,它会向您显示泄漏线。检查该行的堆栈,它会告诉你哪个对象泄漏。它可能在''do something'与'game.date'相关的代码中。 – TechZen 2010-07-13 13:34:53