gpt4 book ai didi

macos - 在内存中 mergeChangesFromContextDidSaveNotification 并保存内存泄漏

转载 作者:行者123 更新时间:2023-12-03 17:53:56 29 4
gpt4 key购买 nike

当我在内存类型 nsmanagementobjectcontext 中使用时,我的应用程序(osx 10.8.3)的内存大小有所增加:

波纹管是仪器的前 2 个函数。

我确实清除了内存问题,但泄漏仍然存在。你能建议我必须寻找的任何方式吗?

这里是一个顶级负责调用者(全部针对 CoreData):

CoreData    -[_NSFaultingMutableOrderedSet willRead] 
CoreData _PFAllocateObject
CoreData [NSDictionaryStoreMap _nodeFromObject:objectIDMap:]

enter image description here

enter image description here

最佳答案

Bcs Marcus 没有写任何例子,我想尝试回答我自己的问题:正如我所见,内存泄漏消失了。但我更痛苦,让我们逐步描述。

在调查了互联网资源的经验后,我选择了方案:我有两个内存主 MOC,具有不同的持久存储坐标。

  • 动态信息的主要 MOC (NSMainQueueConcurrencyType)
  • 静态信息的主要 MOC (NSMainQueueConcurrencyType)

这是因为我对第一个 moc 的负载非常高,对第二个 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,并尝试以级联模式删除它们。

我认为保存时错误太多不是个好主意,我尝试使用 acquirePermanentID: 函数来修复它。错误消失,但我收到了崩溃报告,该报告不时启动,如下所述:

core data child/parent save exception

然后,我删除了所有 acquirePermanentID 并返回到清晰的代码。但现在,之前的崩溃发生了崩溃:

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 它位于苹果库内部,而它们确实执行请求)。苹果的错误报告几个月都没有得到答复。这里有两件事是可以的。首先 - 我不明白新模型中的某些内容(也许主 MOC 必须位于 NSPrivateQueueConcurrencyType 中,子 MOC 必须位于 NSMainQueueConcurrencyType 中,或者我需要保存或合并某些内容(但苹果告诉不行),或者我需要移动所有问题核心对象的数量,例如在相应 MOC 的 ^performBlock 内插入新对象获取请求等)。其次 - 新的核心数据模型有太多问题,我需要将其移出并使用对象创建自己的模型。

合理的建议和经验分享将不胜感激。我将添加更多信息,同时我将调查避免发现错误的所有方法。

更新

目前,对我来说是个好消息(但对苹果来说可能不是好消息)错误已因非常奇怪的原因得到修复。在我的模型中,我有这个方案:ActiveSession ----(对一) ---> ActiveSessionIncomingLeg --(对多)-> ActivePacket ----(对一) ---> ActiveSessionOutgoingLeg --(对多)-> ActivePacket使用一对一关系的原因是我只有一条腿传入和传出。它在子/父方案之前运行良好,让我可以轻松访问以下属性:

NSOrderedSet *set = incomingLeg.activeSession.activeSessionOutgoingLeg.activePacket;

只是为了检查一下,我将一对一关系更改为特定(对多)关系。哇——崩溃已经解决了。希望它可以对社区有所帮助。快乐编码。

关于macos - 在内存中 mergeChangesFromContextDidSaveNotification 并保存内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16892516/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com