1

我的核心数据在我的 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,我遇到了内存不足的情况。

任何节省内存的帮助将不胜感激!我整天都在为此挠头

4

0 回答 0