Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 如何使核心数据在删除对象后释放内存?_Objective C_Core Data_Memory_Nsmanagedobjectcontext - Fatal编程技术网

Objective c 如何使核心数据在删除对象后释放内存?

Objective c 如何使核心数据在删除对象后释放内存?,objective-c,core-data,memory,nsmanagedobjectcontext,Objective C,Core Data,Memory,Nsmanagedobjectcontext,步骤1:打开文档 NSFileManager *fileManager = [NSFileManager defaultManager]; NSURL *documentDirectory = [[fileManager URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] firstObject]; NSString *documentName = @"MyDocument"; NSURL *url = [docume

步骤1:打开文档

NSFileManager *fileManager = [NSFileManager defaultManager];
NSURL *documentDirectory = [[fileManager URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] firstObject];
NSString *documentName = @"MyDocument";
NSURL *url = [documentDirectory URLByAppendingPathComponent:documentName];
document = [[UIManagedDocument alloc] initWithFileURL:url];
BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:url.path];
if (fileExists) {
    [document openWithCompletionHandler:^(BOOL success) {[self documentOpened:success];}];

}else{
    [document saveToURL:url forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success){[self documentOpened:success];}];
}

步骤2:获取一个对象

+(Game*) gameWithDate:(NSDate*)date
           inContext:(NSManagedObjectContext*)context
{
    Game* res;
    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Game"];
    request.predicate = [NSPredicate predicateWithFormat:@"date == %@", date];
    NSError *error;
    NSArray *matches = [context executeFetchRequest:request error:&error      ];
    if(!matches || error || [matches count] > 1)
    {
        NSLog(@"Error: NO Game in DB");
    }else
    {
        if ([matches count])
        {
            res = [matches firstObject];
            NSLog(@"Fetching existing game");
        }else
        {
            NSLog(@"Creating a game");
        }

    }
    return res;
}
步骤3:我删除对象:

Game *g = [Game gameWithDate:lastDate inContext:managedObjectContext];
[managedObjectContext deleteObject:g];
g = nil;
游戏对象约为20兆字节。 在执行步骤3之后,我注意到在步骤2中由core data分配的内存在步骤3之后没有释放。如果我在循环中执行步骤2和步骤3,内存会一直得到分配,但从未释放

我读到可能是撤销管理器让这个内存保持活动状态,所以我在步骤1中关闭了它,但它没有帮助。 我试过:

或:

就在第三步之后。内存已解除分配,但对象未被删除

我还尝试:

[managedObjectContext save:nil];
就在第三步之后。内存没有被释放

有没有办法使核心数据在删除后解除锁定内存?
一般来说,是否有办法使核心数据尽可能少地保存这些重对象?

刷新从持久存储重新加载的对象。重置将从内存中删除您所做的任何更改

这两个操作都将忘记您已删除对象的事实,因为该更改仅在内存中


删除后需要保存上下文

显然,UIManagedDocument假设自动保存更改,然后放弃游戏指针,导致IOS释放内存。UIManagedDocument按自己的时间自动保存。此计时不包括上述情况,因此内存保持不变。 解决方法是通过以下方式强制UIDocument保存对持久性存储的所有更改:

NSFileManager *fileManager = [NSFileManager defaultManager];
NSURL *documentDirectory = [[fileManager URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] firstObject];
NSString *documentName = @"MyDocument";
NSURL *url = [documentDirectory URLByAppendingPathComponent:documentName];
[document saveToURL:url forSaveOperation:UIDocumentSaveForOverwriting completionHandler:^(BOOL success) {
    if (!success) {
        NSLog(@"Failed in saveToURL");
    }
}];

之后,内存被释放

我试过了,但没用。我编辑了这个问题。你真的在重置之前保存了上下文吗?请注意,我使用的是托管文档,它是CoreData之上的抽象层。将save:发送到我的managedObjectContext没有任何影响,因为它是一个子上下文。我现在正在调查,希望尽快发布答案。。。
[managedObjectContext reset];
[managedObjectContext save:nil];
NSFileManager *fileManager = [NSFileManager defaultManager];
NSURL *documentDirectory = [[fileManager URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] firstObject];
NSString *documentName = @"MyDocument";
NSURL *url = [documentDirectory URLByAppendingPathComponent:documentName];
[document saveToURL:url forSaveOperation:UIDocumentSaveForOverwriting completionHandler:^(BOOL success) {
    if (!success) {
        NSLog(@"Failed in saveToURL");
    }
}];