【发布时间】:2012-08-30 23:57:04
【问题描述】:
我有这个问题。 我在 Core Data 中有一个图像数据库。 我获取所有图像(大约 80MB)并放入一个 NSMutableArray。 对象已正确出错:
NSArray *fetchResults = [self.managedObjectContext executeFetchRequest:request error:&error];
self.cache = [NSMutableArray arrayWithArray:fetchResults];
for (ImageCache *imageObject in self.cache) {
NSLog(@"Is fault? %i", [imageObject isFault]);
}
阅读日志,我看到所有对象都正确错误 但是,使用 Instruments,我看到使用了 80MB 的内存。 我认为这就是 Core Data 缓存它的结果的原因,并且应该在需要时释放内存。 但是(这是我的“问题”),如果我模拟内存警告,什么都不会发生! 80MB 仍然存在。
查看工具 - 分配,80MB 被许多 Malloc 使用:(示例)
图表类别 Live Bytes # Living # Transitory 总体字节数 # 总体 # 分配(净/总体) 0 Malloc 176,00 KB 8,59 MB 50 57 18,39 MB 107 %0.00, %0.00 0 Malloc 200,00 KB 8,20 MB 42 460 98,05 MB 502 %0.00, %0.04 0 Malloc 168,00 KB 7,05 MB 43 19 10,17 MB 62 %0.00, %0.00
这是整个调用树图像的链接:https://www.dropbox.com/s/du1b5a5wooif4w7/Call%20Tree.png
有什么想法吗?谢谢
【问题讨论】:
-
也许 Core Data 释放了
Memory Warning Level 2的内存?您的场景是否可能导致内存不足崩溃? -
有什么“神奇的方法”来模拟内存警告级别 2?还是“简单地”我必须消耗内存?
-
我不知道任何模拟方法。您应该运行另一个“重”应用程序(例如 Appstore),将您的应用程序保持在后台并跟踪控制台日志和 Instruments 内存图表。
level 2警告将在控制台中提到 - 所以你应该在那一刻查看内存图表。 -
Mmmmhh...但是如果我将应用程序保持在后台,它将被冻结,所以我不会收到来自系统的消息,不是吗?但是我尝试了其他方法。我做了一个循环,开始浪费内存(一个简单的随机NSData数组)。我增加了总内存尝试各种数量,(尝试了很多次,有时让 iOS 杀死我的应用程序),但 Core Data 从未释放缓存:-/(显然在设备上尝试,而不是在模拟器上)
-
Mmmhh...在此链接中,文档说内存警告不会发送到暂停的应用程序:developer.apple.com/library/ios/#DOCUMENTATION/iPhone/…“当系统向您的应用程序发送低内存警告时,请立即响应。iOS只要可用内存量低于安全阈值,就会通知所有正在运行的应用程序。(它不会通知暂停的应用程序。"
标签: objective-c ios xcode core-data memory-management