Tam*_*nad 13 memory memory-management core-data objective-c ios
我的问题是核心数据和内存未被发布.我正在进行同步过程,从WebService导入数据,返回一个json.我在内存中加载要导入的数据,循环并创建NSManagedObjects.导入的数据需要创建与其他对象有关系的对象,总共大约有11.000.但是为了隔离问题,我现在只创建第一级和第二级的项目,将关系排除在外,这些是9043个对象.
我开始检查使用的内存量,因为应用程序在进程结束时崩溃(使用完整的数据集).第一次内存检查是在内存中加载json之后,因此测量确实只考虑创建,并将对象插入到Core Data中.我用来检查使用的内存是这个代码(源)
-(void) get_free_memory {
struct task_basic_info info;
mach_msg_type_number_t size = sizeof(info);
kern_return_t kerr = task_info(mach_task_self(),
TASK_BASIC_INFO,
(task_info_t)&info,
&size);
if( kerr == KERN_SUCCESS ) {
NSLog(@"Memory in use (in bytes): %f",(float)(info.resident_size/1024.0)/1024.0 );
} else {
NSLog(@"Error with task_info(): %s", mach_error_string(kerr));
}
}
我的设置:
BMC独立于MMC,因此BMC不是MMC的子环境.并且他们不共享任何父母背景.我不需要BMC通知MMC的更改.所以BMC只需要创建/更新/删除数据.
者平台:
问题: 导入数据后,使用的内存不会停止增加,即使在进程结束后iOS似乎也无法耗尽内存.在数据样本增加的情况下,导致内存警告和应用程序关闭后.
研究:
Apple文档
将数据导入Core Data(Stackoverflow)时要记住的要点的好回顾
测试完成并分析内存释放.他似乎和我有同样的问题,他发送了Apple Bug报告但尚未得到Apple的回复.(来源)
导入和显示大型数据集(来源)
表示导入大量数据的最佳方式.虽然他提到:
"我可以在稳定的3MB内存中导入数百万条记录而无需调用-reset."
这让我觉得这可能是某种可能的?(来源)
测试:
数据样本:共创建9043个对象.
码:
- (void)processItems {
[self.context performBlock:^{
for (int i=0; i < [self.downloadedRecords count];) {
@autoreleasepool
{
[self get_free_memory]; // prints current memory used
for (NSUInteger j = 0; j < batchSize && i < [self.downloadedRecords count]; j++, i++)
{
NSDictionary *record = [self.downloadedRecords objectAtIndex:i];
Item *item=[self createItem];
objectsCount++;
// fills in the item object with data from the record, no relationship creation is happening
[self updateItem:item WithRecord:record];
// creates the subitems, fills them in with data from record, relationship creation is turned off
[self processSubitemsWithItem:item AndRecord:record];
}
// Context save is done before draining the autoreleasepool, as specified in research 5)
[self.context save:nil];
// Faulting all the created items
for (NSManagedObject *object in [self.context registeredObjects]) {
[self.context refreshObject:object mergeChanges:NO];
}
// Double tap the previous action by reseting the context
[self.context reset];
}
}
}];
[self check_memory];// performs a repeated selector to [self get_free_memory] to view the memory after the sync
}
Measurment:
它从16.97 MB到30 MB,在同步后降至28 MB.每5秒重复一次get_memory调用,将内存保持在28 MB.
没有运气的其他测试:
也许我错过了一些东西,但我已经经过了很多测试,按照指导原则,我希望看到内存再次减少.我已经运行了Allocations工具来检查堆增长,这似乎也很好.也没有记忆泄漏.
我的测试/调整的想法已经不多了...如果有人能帮助我了解我可以测试的其他内容,或者指出我做错了什么,我真的很感激.或者就是这样,它应该如何工作......我怀疑......
谢谢你的帮助.
编辑
我已经使用工具来分析活动监视器模板的内存使用情况,"真实内存使用"中显示的结果与在控制台中打印的结果相同,get_free_memory并且内存似乎永远不会被释放.