我解析文件的内容,以便在上下文中创建一组NSManagedObject
并保存它们。这是我这样做的方法:
- (BOOL)getEntitiesFromFileInContext:(NSManagedObjectContext *)context
{
BOOL result = YES;
NSMutableArray *entities = [[NSMutableArray alloc] init];
NSString *entitiesFileContent = [FilesManagerHelper readFile:fileName];
if ([entitiesFileContent isEqualToString:@""]) {
result = NO;
}
else {
@autoreleasepool {
entities = [self parseEntitiesFileContent:entitiesFileContent inContext:context];
// If entities.count > 0, some operations here
}
// Save context and reset
[self saveContext:context];
[self clearContext:context];
}
return result;
}
在parseEntitiesFileContent:inContext:
方法中,我在我提供的上下文中插入NSManagedObject
个对象,并将它们添加到entities
数组中。
我在@autoreleasepool
中执行此操作,因为我找到了一个例子,但我不确定它是否真的有必要......有人能解释一下使用{{1}之间的区别吗?应该没有使用它?
非常感谢
编辑:是否应在@autoreleasepool
块内定义entities
数组?
答案 0 :(得分:0)
@autorelase
语句意味着创建一个自动释放池,该池将包含标记为自动释放的所有对象,范围为@autorelease{}
。因此,当且仅当存在相对大量的自动释放标记对象时,使用@autorelease
才有意义(它不仅需要即时内存释放,而且还需要避免&#34) ;记忆峰值"以及)。内存分配和释放是一个很大的主题,需要在一篇文章中解释,但主要规则是:如果范围包含大量自动释放标记的对象,请使用@autorelease
。
答案 1 :(得分:0)
因为实体是在方法范围内声明但未在自动释放池块中声明的,所以您有一个指向实体的强大指针在这种情况下,自动释放池块和自动释放池将不起作用。
要验证此操作,请尝试在方法返回之前记录实体。
要使自动发布池块具有某种含义,请在自动发布池块中声明实体。
@autoreleasepool {
NSMutableArray *entities = [self parseEntitiesFileContent:entitiesFileContent inContext:context];
// If entities.count > 0, some operations here
}
现在尝试在自动发布池块后直接记录实体。
如果实体很小,这种情况相当简单,但是包含它并不坏,因为它可能有助于提高可伸缩性,因为这种方法可能会随着时间的推移而发展,并且自动释放块开始做更多。如果实体可能很大,那么您肯定需要该池。我的建议是离开自动释放池块并在池块中移动实体的声明。