我使用 CoreData 来存储汽车、行程、GPS 记录的数据等对象。 当我获取想要显示的行程列表、行程的一些统计信息或在我的设置 View Controller 中添加新车时,我几乎使用这种请求:
- (void)getDataTrip
{
// Fetched data trips.
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"DataTrip" inManagedObjectContext:[self managedObjectContext]];
[fetchRequest setEntity:entity];
// Set predicate and sort orderings...
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"timestamp" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
[sortDescriptors release];
[sortDescriptor release];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"idTrip = %@", self.idTrip];
[fetchRequest setPredicate:predicate];
// Execute the fetch -- create a mutable copy of the result.
NSError *error = nil;
NSMutableArray *mutableFetchResults = [[self.managedObjectContext executeFetchRequest:fetchRequest error:&error] mutableCopy];
if (mutableFetchResults == nil) {
// Handle the error.
NSLog(@"failed with error: %@", error);
}
// Set the array.
[self setDataTripArray:mutableFetchResults];
// Memory management.
[fetchRequest release];
[mutableFetchResults release];
}
有时,当我执行[self setDataTripArray:mutableFetchResults];
时会出现泄漏,有时则不会。在这种情况下,当我获取行程数据时,当我使用导航 Controller 返回 Root View Controller (显示行程列表)和/或更改选项卡时,它会一直泄漏。
无论如何,它只是泄漏,并且一直来自从 CoreData 获取数据,并将这个数组提供给我的本地数组变量。
如果您知道如何解决此问题,请告诉我!它使应用程序在一段时间后崩溃。 谢谢!
最佳答案
解决方案
我发现在创建另一个用于为 ScrollView 创建图形的 UIViewController 时,我在对象 dataTripArray
对象上执行了 retain
操作。
- (void)loadScrollViewWithPage:(int)page
{
if (page < 0)
return;
if (page >= kNumberOfPages)
return;
// Replace the placeholder if necessary.
GraphController *controller = [self.graphControllers objectAtIndex:page];
if ((NSNull *)controller == [NSNull null])
{
controller = [[GraphController alloc] initWithPageNumber:page data:[self.dataTripArray retain]];
[self.graphControllers replaceObjectAtIndex:page withObject:controller];
[controller release];
}
// Add the controller's view to the scroll view.
if (controller.view.superview == nil)
{
CGRect frame = _scrollView.frame;
frame.origin.x = frame.size.width * page;
frame.origin.y = 0;
controller.view.frame = frame;
[self.scrollView addSubview:controller.view];
}
}
我刚刚删除了retain
,泄漏不再出现。已修复!
关于arrays - CoreData 因获取的结果数组而泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6415441/