0

我解析文件的内容,以便在上下文中创建一组NSManagedObject并保存它们。这是我做的方法:@autoreleasepool在我的场景和ARC中有意义吗?

- (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中执行此操作,因为我找到了一个例子,但我不确定它是否真的有必要...有人可以解释我使用@autoreleasepool而不使用它的区别是什么?

非常感谢

编辑:如若entities阵列@autoreleasepool块内进行定义?

+0

我会期待一个静态分析器警告,说'实体永远不会被读取'。我错过了什么 - 在这个方法的范围内,“实体”的目的是什么? – Bamsworld

+0

@Bamsworld你是对的,我错过了一些代码。编辑代码片段。 – AppsDev

+0

谢谢澄清。 – Bamsworld

回答

0

因为实体在方法的范围内的已宣告但尚未在自动释放池块,你有很强的指向实体自动释放池块之外,在自动释放池这种情况将不起作用。

在方法返回之前验证此尝试日志记录实体

对于自动释放池块有一定的意义,在自动释放池块内声明实体

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

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

现在尝试登录实体自动释放池块之后直。

这种情况是相当平凡的,如果实体虽小,但它是不是一个坏的,包括因为它可能与可扩展性帮助,因为这方法可随着时间的推移而自动释放块开始做多。如果实体可能很大,那么你绝对需要这个池。我的建议是离开自动释放池块,并将实体的声明移到池块内。

0

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

+0

谢谢,所以......只有当我希望得到一个非常大的文件时,才会使用'@ autorelease'来解析对象?问题是我不知道在这个文件中有多少物体。为了以防万一,保留'@ autorelease'块会更好吗? – AppsDev

+0

你的问题的答案是:“不完全”。关于大量的数据:如果你使用1个NSData实例,它将被释放(当你停止使用它时)或者如果你将数据分配给一个,那么它将被强大的引用保留。保持@autorelease范围没有理由是矫枉过正的。这一切都取决于您使用的“autorelease-marked”对象的数量以及您计划在范围末尾处对这些对象执行的操作。已经有一个关于StackOverflow的丰富的讨论:http://stackoverflow.com/questions/9086913/objective-c-why-is-autorelease-autoreleasepool-still-needed-with-arc。希望它会有所帮助。 –

+0

非常感谢解释 – AppsDev

相关问题