我的核心数据在我的 iPhone 上消耗大量内存时遇到问题。在开始时,我设置了一个 fetchrequest,如下所示:
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Tweets" inManagedObjectContext: [[ChubbyEyetwitterEngine sharedInstance] getManagedObjectContextForUse]];
NSPredicate *predicate =[NSPredicate predicateWithFormat:@"isWatchList==NO && favorited == NO && accountHolder.id_str == %@ ",[[ChubbyEyetwitterEngine sharedInstance] getActiveUserID]];
// Define how we will sort the records
NSSortDescriptor *sortDescriptor = [[[NSSortDescriptor alloc] initWithKey:[sortTweetaryTimeLine objectForKey:@"sortKey"] ascending:[[sortTweetaryTimeLine objectForKey:@"ascending"] boolValue]] autorelease];
NSSortDescriptor *secondarySortKey = [[[NSSortDescriptor alloc] initWithKey:@"created_at" ascending:FALSE] autorelease];
NSArray *sortDescriptors = [NSArray arrayWithObjects:
sortDescriptor,
secondarySortKey,nil];
NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
[request setEntity:entity];
[request setPredicate:predicate];
[request setSortDescriptors:sortDescriptors];
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone)
{
//smaller batch on iphone
[request setFetchBatchSize:12];
}else {
//bigger on the ipad
[request setFetchBatchSize:100];
}
//prefetching important relationships to cache data
[request setRelationshipKeyPathsForPrefetching:[NSArray arrayWithObjects:@"ownerOfThisTweetary",@"thisEntity", nil]];
diaryFetchResultsController= [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:[[ChubbyEyetwitterEngine sharedInstance] getManagedObjectContextForUse] sectionNameKeyPath:[sortTweetaryTimeLine objectForKey:@"sectionName"] cacheName:nil] ;
NSError *fetchError = nil;
if ([diaryFetchResultsController performFetch:&fetchError]) {
}else
{
}
diaryFetchResultsController.delegate = self;
在此之后,我在我的 tabeview 上调用 reloadData。在我的表格视图中,我根据 text 属性的长度以及 managedobject 上的其他属性动态计算单元格的高度并返回高度。
这里的问题是,在调用重新加载数据时,fetchedresultscontroller 中的所有对象都调用了 heightforrow,这反过来又将对象错误地放入内存。现在我的 tableview 有很多对象,进入数百个,我的内存消耗激增。
我正在寻找一种节省内存的方法:
我尝试做的事情:[diaryFetchResultsController.managedObjectContext setStalenessInterval:2.0]; 这没有任何效果,或者至少是我可以看到的效果,所以我尝试了其他方法->
在 heightForRowAtIndexPath 内,计算高度后,我尝试了 [diaryFetchResultsController.managedObjectContext refreshObject:object mergeChanges:YES]; 结果很糟糕,并导致了无限循环,实际发生的是当对象出现故障时,系统会自动为该索引路径调用 heightForRowAtIndexPath。
我的第二次尝试是从 heightForRowAtIndexPath 中删除刷新对象,而是在 cellForRowAtIndexPath 的末尾插入。结果与上述相同。
我的第三次尝试::
-(无效)turnMeBackIntoAfault{
for (id object in diaryFetchResultsController.fetchedObjects){
[diaryFetchResultsController.managedObjectContext refreshObject:object mergeChanges:YES];
}
}
然后我在 tableview 上调用 reloadData 后立即调用此方法。结果是对所有单元格调用了一次 heightForRowAtIndexPath(如预期的那样),然后在所有管理对象上调用了 turnMeBackIntoAfault。然而,坏消息是,在系统之后立即再次为所有单元格调用 heightForRowAtIndexPath,因此否定了将对象转回故障的影响。我还尝试在出错之前将 tableveiw 代表和数据源设置为 nil 并将 fetchedresultscontroller 代表设置为 nil,并在循环后再次将它们设置回自身,但效果仍然相同。
现在我绝对确定它的 heightForRowAtIndexPath 会导致大量内存消耗。我已经尝试过注释掉的 heightForRowAtIndexPath,我有几乎超过 1.5 倍的可用内存可用。
拥有动态行对我的应用程序至关重要,并且由于我的应用程序广泛使用 fetchedresultControllers 和 tableviews,我遇到了内存不足的情况。
任何节省内存的帮助将不胜感激!我整天都在为此挠头