Objective c 如何使核心数据在删除对象后释放内存?
步骤1:打开文档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
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");
}
}];