@autoreleasepool在我的场景和ARC中是否有意义?

时间:2015-09-26 10:58:15

标签: ios automatic-ref-counting autorelease nsautoreleasepool

我解析文件的内容,以便在上下文中创建一组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数组?

2 个答案:

答案 0 :(得分:0)

@autorelase语句意味着创建一个自动释放池,该池将包含标记为自动释放的所有对象,范围为@autorelease{}。因此,当且仅当存在相对大量的自​​动释放标记对象时,使用@autorelease才有意义(它不仅需要即时内存释放,而且还需要避免&#34) ;记忆峰值"以及)。内存分配和释放是一个很大的主题,需要在一篇文章中解释,但主要规则是:如果范围包含大量自动释放标记的对象,请使用@autorelease

答案 1 :(得分:0)

因为实体是在方法范围内声明但未在自动释放池块中声明的,所以您有一个指向实体的强大指针在这种情况下,自动释放池块自动释放池将不起作用。

要验证此操作,请尝试在方法返回之前记录实体

要使自动发布池块具有某种含义,请在自动发布池块中声明实体

@autoreleasepool {
       NSMutableArray *entities = [self parseEntitiesFileContent:entitiesFileContent inContext:context];

       // If entities.count > 0, some operations here
   }

现在尝试在自动发布池块后直接记录实体

如果实体很小,这种情况相当简单,但是包含它并不坏,因为它可能有助于提高可伸缩性,因为这种方法可能会随着时间的推移而发展,并且自动释放块开始做更多。如果实体可能很大,那么您肯定需要该池。我的建议是离开自动释放池块并在池块中移动实体的声明。