当我在内存类型nsmanagedobjectcontext中使用时,我的应用程序的内存大小(osx 10.8.3)有所增加:
贝娄是乐器的前2个功能。
我在内存问题上清除了这一点,但仍然存在漏洞。你能以任何方式建议我必须寻找吗?
这里是一个负责任的主要来电者(全部为CoreData):
CoreData -[_NSFaultingMutableOrderedSet willRead]
CoreData _PFAllocateObject
CoreData [NSDictionaryStoreMap _nodeFromObject:objectIDMap:]
答案 0 :(得分:1)
Bcs Marcus不写任何例子,我想尝试回答我自己的问题: 我看到内存泄漏消失了。但是我得到了更多的痛苦,让我们一步一步地描述。
在调查互联网资源的经验后,我选择了方案: 我有两个inMemory主MOC,它们具有不同的持久存储坐标。
这是bcs我对第一个moc有很高的负载而且没有太多到第二个(但是有大量的数据)
然后,所有创建的线程都创建自己的MOC(NSPrivateQueueConcurrencyType),根据类型创建父项并执行它们可以执行的操作。它是多线程服务器,所以我可以从另一个线程中删除对象。
这是保存代码:
-(void) finalSaveMocInMemoryForDynamicInformation;
{
[_mocInMemoryForDynamicInformation performBlock:^{
@try {
if ([_mocInMemoryForDynamicInformation hasChanges]) {
NSError *error;
AppDelegate *delegateMain = (AppDelegate *)[[NSApplication sharedApplication] delegate];
if ([_mocInMemoryForDynamicInformation save:&error])
{
[delegateMain.managedObjectContextInMemoryForDynamicInformation performBlock:^{
@try {
if ([delegateMain.managedObjectContextInMemoryForDynamicInformation hasChanges]) {
NSError *error;
if (![delegateMain.managedObjectContextInMemoryForDynamicInformation save:&error])
{
[self logError:error forDelegate:delegateMain];
}
}
}
@catch (NSException *exception) {
NSLog(@"SIP CONTROLLER:ERROR:%@:%@ exception->%@ inside managedObjectContextInMemoryForDynamicInformation",[self class], NSStringFromSelector(_cmd),exception);
return ;
}
}];
} else [self logError:error forDelegate:delegateMain];
}
}
@catch (NSException *exception) {
NSLog(@"SIP CONTROLLER:ERROR:%@:%@ exception->%@ inside _mocInMemoryForDynamicInformation",[self class], NSStringFromSelector(_cmd),exception);
return ;
}
}];
}
模型在旧方案之前正常工作。 当我开始在生产中使用服务器时,我在保存时遇到了大量错误,在这里说不能删除不存在的对象(三个子对象)。看起来核心数据不理解对象具有临时ID并尝试以级联模式删除它们。
我在考虑太多错误,同时保存不好主意,我尝试使用obtainPermanentID:function来修复它。错误消失了,但我得到了崩溃报告,这个报告在这里描述:
core data child/parent save exception
然后,我删除了所有获得的PermanentID并返回清除代码。但现在相反,以前的崩溃发生了崩溃:
0 com.apple.CoreFoundation 0x00007fff867bcbd1 __CFBasicHashAddValue + 1297
1 com.apple.CoreFoundation 0x00007fff867c3268 CFBasicHashAddValue + 3176
2 com.apple.CoreFoundation 0x00007fff867d8ba9 CFSetAddValue + 121
3 com.apple.CoreData 0x00007fff89f15986 -[NSManagedObjectContext(_NSInternalAdditions) _insertObjectWithGlobalID:globalID:] + 182
4 com.apple.CoreData 0x00007fff89f15850 -[NSManagedObjectContext insertObject:] + 144
5 com.apple.CoreData 0x00007fff89eec056 -[NSManagedObject initWithEntity:insertIntoManagedObjectContext:] + 534
6 com.apple.CoreData 0x00007fff89f15722 +[NSEntityDescription insertNewObjectForEntityForName:inManagedObjectContext:] + 178
7 com.yourcompany.callsfreecalls 0x000000010b3a87f9 -[SipController packetForData:forSocketData:isUDPsocket:forIncomingLeg:] + 23545
Crashed Thread: 15 Dispatch queue: socketIncomingLegQueue
Exception Type: EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0xfffffffffffffff8
VM Regions Near 0xfffffffffffffff8:
--> shared memory 00007fffffffe000-00007ffffffff000 [ 4K] r-x/r-x SM=SHM
两次崩溃都在核心数据内部,这意味着我无法做到这一点。它无法通过CORE_DATA_DEBUG来调试bcs加载太高,我无法@catch异常bcs它在apple libs中,而它们执行请求)。 Apple bug报告几个月都没有回答。 这可以是两件事。首先 - 我不理解新模型中的东西(也许主要的MOC必须在NSPrivateQueueConcurrencyType中,而子MOC必须在NSMainQueueConcurrencyType中,或者我需要保存或合并某些东西(但苹果告诉不行),或者我需要移动所有问题核心对象如插入新对象获取请求等内部^ performBlock的MOCs等等)。 第二 - 新的核心数据模型太多了,我需要将其移出并用对象做自己的模型。
合理的建议和经验分享将不胜感激。我将添加更多信息,同时我将调查所有方法以避免发现错误。
<强>更新强>
现在,对我来说是好消息(但可能对苹果不利)错误是由非常奇怪的原因解决的。 在我的模型中我有这个方案: ActiveSession ----(to-one)---&gt; ActiveSessionIncomingLeg - (to-many) - &gt; ActivePacket ----(to-one)---&gt; ActiveSessionOutgoingLeg - (to-many) - &gt; ActivePacket 使用一对一关系的原因是我只有一条腿传入和传出。它在子/父方案之前工作正常,让我可以轻松访问以下属性:
NSOrderedSet *set = incomingLeg.activeSession.activeSessionOutgoingLeg.activePacket;
为了检查,我改变了与特定(对多)的关系。而WOW - 崩溃已经完成了。 希望它可以帮助社区。快乐的编码。
答案 1 :(得分:0)
这次泄漏有多大?多频繁?如果泄漏在核心数据内部(如图所示)并且很小,除了提交雷达之外,您可能无能为力。
我建议您切换到使用父/子上下文设计而不是使用NSManagedObjectContextDidSaveNotification
,因为这样更快,不会阻塞主线程,并且可能会解决内存泄漏问题。< / p>
300Mb的分配不是泄漏。分配是应用程序在运行时使用的内存量。如果您的泄漏很小(看起来就是这种情况)并且它在Core Data本身内部,那么就没有什么可以做的,因为它不值得追逐。