停止与核心数据托管对象相关的堆增长

Posted

技术标签:

【中文标题】停止与核心数据托管对象相关的堆增长【英文标题】:Stopping Heap Growth Related to a Core Data Managed Object 【发布时间】:2012-12-19 15:45:54 【问题描述】:

我在运行仪器时注意到一些堆增长。没有泄漏,但有一些内存未清除,这似乎是我使用核心数据造成的。

从堆栈跟踪看来,增长发生在我保存托管对象时。

这就是我创建托管对象的方式:

ScramblerGame *game = (ScramblerGame *)[NSEntityDescription insertNewObjectForEntityForName:@"ScramblerGame" inManagedObjectContext:self.context];
game.time = [NSNumber numberWithInt:self.time];
game.score = 0; //etc...

ScramblerGame 是直接从数据模型创建的托管对象子类,无需修改。

这是我访问和更新托管对象的方式:

self.game.score = [NSNumber numberWithInt:[self.game.score intValue] + score];

self.game 是另一个类中对托管对象的弱引用。

这是在游戏结束时调用的保存或删除数据的方法。它也是我在引用图像的堆栈跟踪中调用的最后一个方法,导致堆增长。

-(void)saveAndHandleGameData:(BOOL)stillPlaying
[[NSNotificationCenter defaultCenter] removeObserver:self name:NSManagedObjectContextObjectsDidChangeNotification object:nil];

//save the data to disk
self.game.inProgress = [NSNumber numberWithBool:stillPlaying];
SCAppDelegate *appDelegate = ((SCAppDelegate *)[[UIApplication sharedApplication] delegate]);
NSManagedObjectContext *context = appDelegate.managedObjectContext;

if([self.game.score intValue] == 0)
    [context deleteObject:self.game];
[context save:nil];
self.game = nil;


那么我是不是对导致这种情况的核心数据做错了什么?关于如何阻止堆增长的任何建议?

【问题讨论】:

【参考方案1】:

一切看起来都不错。内存的最小增加可以认为是正常的,应该是可以预期的。

【讨论】:

以上是关于停止与核心数据托管对象相关的堆增长的主要内容,如果未能解决你的问题,请参考以下文章

如何获取与其他不使用 id 字段相关的托管对象?

核心数据提取结果减少相关项目集

核心数据对象在其相关对象的属性更改时更新

核心数据:托管对象与上下文一起保存后如何撤消操作

调试器在核心数据保存时停止,但没有错误输出

iOS - 核心数据堆栈作为带有主 NSManagedObjectContext 的单例