gpt4 book ai didi

cocoa - 核心数据删除时内存使用率较高

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

在我的 Garbage Collected Mac 应用程序中,由于我组合了一个辅助函数来删除特定类型的所有核心数据实体,因此我遇到了显着高的内存使用率。函数如下,供引用:

- (void)deleteAllObjectsForEntity:(NSString *)entityDescription {
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:entityDescription inManagedObjectContext:self];
[request setEntity:entity];
[request setIncludesPropertyValues:NO];

NSError *error = nil;
NSArray *items = [self executeFetchRequest:request error:&error];
[request release];

// Delete all objects
for (NSManagedObject *managedObject in items)
{
[self deleteObject:managedObject];
}

// Should probably check for errors here
[self save:&error];
[self reset];

// Suggest the garbage collector tries to tie up any loose ends
[[NSGarbageCollector defaultCollector] collectIfNeeded];
}

通过使用堆快照分析,我可以看到每次使用上述函数删除 FileRecord 实体的所有实例时,堆都会增长大约 50MB。内存似乎永远无法恢复。

通过使用 -com.apple.CoreData.SQLDebug 1 启动参数,我可以看到大部分内存是由 NSFetchRequest 期间触发的(许多)SELECT 语句引起的。似乎每次选择这些对象时,Core Data 都会引发错误(从而分配内存)。显然我不需要触发这些错误,因为我随后将删除该对象。这是我的控制台输出的示例:

CoreData: annotation: fault fulfilled from database for : 0x2002ed3e0 <x-coredata://17E6216A-C2FA-42A6-B8E4-5209CD1AB2CA/FileRecord/p117418>

CoreData: sql: SELECT 0, t0.Z_PK, t0.Z_OPT, t0.ZNORMALIZEDPATH, t0.ZSIZE, t0.ZFILENAME, t0.ZKIND, t0.ZNORMALIZEDFILENAME, t0.ZPATH FROM ZFILERECORD t0 WHERE t0.Z_PK = ?

无论我做什么,我都无法放弃这段内存。如您所见,我保存并重置 NSManagedObjectContext。此外,我向垃圾收集器暗示它应该尝试收集任何残留数据。

不幸的是,我正在使用现有的核心数据架构,因此无法设置诸如级联删除规则之类的内容。无论如何,我在这里做错了什么?

最佳答案

也许解决我遇到的这个问题的最佳方法是重新设计我的数据模型以创建一个中间对象,该对象包含与我要删除的所有对象的一对多关系。通过将中间对象的删除规则设置为级联,可以删除中间对象并让它删除幕后剩余的对象。

关于cocoa - 核心数据删除时内存使用率较高,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6385660/

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