关于MagicalRecord的问题

Posted

技术标签:

【中文标题】关于MagicalRecord的问题【英文标题】:Questions about MagicalRecord 【发布时间】:2013-12-26 19:17:25 【问题描述】:

1 - MagicalRecord 与 ARC 兼容吗?

2 - 对于此代码

+ (NSManagedObjectContext *) MR_context NS_RETURNS_RETAINED

NS_RETURNS_RETAINED 表示上述方法创建的NSManagedObjectContext 将被保留,那么一旦完成,如何确保将其从内存中删除?

3 - 即使在 for 循环中使用 @autoreleasepool 块对使用

获取的 NSManagedobject 实体进行更新
+ (NSArray *) MR_findAllWithPredicate:(NSPredicate *)searchTerm inContext:(NSManagedObjectContext *)context

然后调用

[context save:nil];
[context reset];

不会释放内存并且会继续增加。为什么在NSManagedObjectContext 上调用reset 不会使获取的实体无效?这些实体也确实有关系。 context 的类型为 NSPrivateQueueConcurrencyType

【问题讨论】:

【参考方案1】:

我会尽力回答你的问题。

1- 是的。神奇的记录是 ARC 兼容的。我在一个测试项目中添加了最新的源代码,并且我验证了没有release 调用。此外,还使用了weak 限定符。

2 - 不用担心。在 ARC 下,将为您管理内存。你可以在Migrating your code to Objective-C ARC 找到一个很好的解释。另见Objective-C Automatic Reference Counting (ARC) 的 3.2.2 部分。

3 - 这取决于您的代码。执行reset 它将清除特定上下文,因此内存占用会更小。无论如何,在这里你应该添加一些细节。

我不深入了解 Magical Record,但即使它是一个好的库(我认为 Saul Mora 做得很好),我认为您可以只使用普通的 Core 数据,因为它可能更难发现错误。

【讨论】:

【参考方案2】:

要回答问题 3,您在代码中没有看到释放内存分配的原因如下:

@autoreleasepool 
    /// working stuff up here
    [context reset];

基本上是因为您无法控制该内存。 Core Data(你拥有的 NSManagedObjectContext)将为你缓存对象。它还将对象数据缓存在内存中的 NSPersistentStoreCoordinator 中。通常,您应该在完成后释放整个上下文以查看一些(甚至是很小的)内存使用量下降。不要担心创建许多上下文,它们是轻量级的,并且可以像这样在任何地方创建。

【讨论】:

以上是关于关于MagicalRecord的问题的主要内容,如果未能解决你的问题,请参考以下文章

Magical Record、多种配置和 Restkit

AFNetworking 的 Magical Record 导入问题

尝试将 Magical Record 与 Kiwi 一起使用时构建测试时出错

Magical Record - 丢失我的实体信息

使用 Magical Record 在 NSDictionary 中导入数组

Magical Record - 设置时崩溃