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

时间:2011-06-27 14:23:09

标签: cocoa macos core-data memory-leaks garbage-collection

在垃圾收集环境中,我正在构建一个使用Core Data和Sync Services的应用程序。核心数据模型和商店是地址簿联系信息的表示(如Apple here所述)。

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

然而,似乎当我创建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;
}

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

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

没有

CoreData将保留对该方法内创建的托管对象的引用,直到释放或重置与其关联的NSManagedObjectContext实例。