gpt4 book ai didi

cocoa - 应用程序似乎正在泄漏内存

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

在垃圾收集环境中,我正在构建一个使用核心数据和同步服务的应用程序。核心数据模型和存储是地址簿联系人信息的表示(如 Apple here 所述)。

该应用程序的目标是通过同步服务与我们的在线服务同步地址簿中的联系人。这意味着解析核心数据存储中的更改(添加、更新、删除),稍后将由同步服务获取(反之亦然)。

但是,当我创建 Core Data 对象时,它们似乎永远不会被释放。我使用的代码如下(我已将泄漏范围缩小到以下指令):


SLSyncLog *syncLog = [SLSyncLog singletonFromContext:context];


+ (SLSyncLog *)singletonFromContext:(NSManagedObjectContext *)context {
NSEntityDescription *syncDataDescription = [SLSyncLog entityInManagedObjectContext:context];
return (SLSyncLog *)[SLSingletonLoader loadSingletonOfEntity:syncDataDescription fromContext:context];
}


+ (NSManagedObject *)loadSingletonOfEntity:(NSEntityDescription *)entity fromContext:(NSManagedObjectContext *)context {
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:entity];

NSError *error = nil;
NSArray *results = [context executeFetchRequest:request error:&error];
[request release];

if (error) {
[NSException raise:kSyncDataException format:@"Error retrieving %@ object", [entity name]];
}

if ([results count] > 1) {
[NSException raise:kSyncDataException
format: @"There were %d %@ objects, instead of the expected one.", [entity name], [results count]];
}

NSManagedObject *log = nil;
if ([results count] == 0) {
/* Create the singleton object. */
log = [NSEntityDescription insertNewObjectForEntityForName:[entity name]
inManagedObjectContext:context];
} else {
log = [results objectAtIndex:0];
}

return log;
}

据我所知,这是在垃圾收集环境中,它应该清理这些方法中创建的所有内容。这是核心数据特定的问题吗?

任何帮助将不胜感激。谢谢!

最佳答案

理论上,每次都应该返回相同的对象数组,因为 Core Data 在幕后缓存它们。仅仅因为您认为它们不再在任何地方被引用,并不意味着它们没有被引用。在您保存托管对象上下文之前,它们肯定不会消失。

顺便说一句,错误处理的正确模式是测试返回值是否为 nil,然后才检查 NSError

关于cocoa - 应用程序似乎正在泄漏内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6494364/

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