关于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的问题的主要内容,如果未能解决你的问题,请参考以下文章
AFNetworking 的 Magical Record 导入问题
尝试将 Magical Record 与 Kiwi 一起使用时构建测试时出错