【问题标题】:NSEntityDescription still exist in memory?NSEntityDescription 还存在于内存中吗?
【发布时间】:2013-12-26 17:58:42
【问题描述】:

现在我有一个核心数据实体“AAA”,我使用一种方法来获取它的结果:

- (AAA *)结果{ NSEntityDescription *Entity = [NSEntityDescription entityForName:@"AAA" inManagedObjectContext:self.managedObjectContext]; NSFetchRequest *fetchRequest = [[NSFetchRequest alloc]init]; [fetchRequest setEntity:aaaEntity]; NSError *error = nil; NSArray *fetchRequestResult = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error]; AAA *aaa = fetchRequestResult.lastObject; 返回aaa; }

然后我用Xcode Instruments检查内存状态,它显示:

VM:核心数据对象 ID 4.02MB(实时字节)

实体还存在于记忆中吗?

【问题讨论】:

  • 核心数据对象 ID 是否会一直存在于内存中,直到我停止运行我的应用程序......

标签: ios core-data


【解决方案1】:

首先我要说的是,当你处理 Core Data 时,你不应该担心内存。在引擎盖下,框架为你管理东西。当您检索对象时,Core Data 会填充存储数据的缓存。通过这种方式,进一步的提取不会命中磁盘,而只会命中缓存。

无论如何,您可以依靠两种不同的 API 来控制内存占用。第一个是[context reset]。这将清除整个对象图(属于特定上下文),就像您刚刚创建它一样。

第二个是[context refreshObject:yourManagedObject mergeChanges:NO]。它允许释放一个对象,或者把它变成一个故障。

希望对你有帮助。

【讨论】:

  • @Steve.DC.Tang 对不起。我不明白你在问什么。你能解释得更好吗?
  • 感谢您的回答~顺便说一句,我们可以使用 NSFetchResultController 从实体中获取结果,但它似乎更适合 UITableView。除了 NSFetchResultController,上面的模式(如我的方法)是唯一的吗从实体中获取结果的方法?
  • 要获取结果,请使用NSFetchRequest。但是您可以按照文档中的说明返回不同的结果类型。见resultTypedeveloper.apple.com/library/Mac/DOCUMENTATION/Cocoa/Reference/…
  • “当你处理核心数据时,你不应该担心内存” - 不,这取决于你在处理核心数据。有时您可能需要考虑这一点。
  • “进一步的提取不会命中磁盘,只会命中缓存” - 这太模糊了。进一步获取什么确切性质?当然,仅对该确切实体的进一步获取只能命中行缓存。但可以肯定的是,显示的获取请求仍然会检查持久存储以查看是否存在该实体类型的任何新实例。
猜你喜欢
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-24
  • 2010-12-29
  • 1970-01-01
  • 2011-03-03
  • 1970-01-01
相关资源
最近更新 更多