Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/102.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
Ios @autoreleasepool在我的场景和ARC中有意义吗?_Ios_Automatic Ref Counting_Autorelease_Nsautoreleasepool - Fatal编程技术网

Ios @autoreleasepool在我的场景和ARC中有意义吗?

Ios @autoreleasepool在我的场景和ARC中有意义吗?,ios,automatic-ref-counting,autorelease,nsautoreleasepool,Ios,Automatic Ref Counting,Autorelease,Nsautoreleasepool,我解析文件的内容,以便在上下文中创建一组NSManagedObject,并保存它们。这就是我这样做的方法: - (BOOL)getEntitiesFromFileInContext:(NSManagedObjectContext *)context { BOOL result = YES; NSMutableArray *entities = [[NSMutableArray alloc] init]; NSString *entitiesFileContent = [Fil

我解析文件的内容,以便在上下文中创建一组
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
对象,并将它们添加到
实体
数组中

我在一个
@autoreleasepool
中执行此操作,因为我发现了一个这样做的示例,但我不确定是否真的有必要。。。有人能解释一下使用
@autoreleasepool
和不使用它之间的区别吗

非常感谢


EDIT:是否应在
@autoreleasepool
块内定义
实体
数组?

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

,因为实体是在方法的范围内声明的,而不是在自动释放池块中声明的,您有一个指向自动释放池块之外的实体的强指针,在这种情况下,自动释放池将无效

要验证这一点,请在方法返回之前尝试记录实体

要使自动释放池块具有某种意义,请在自动释放池块中声明实体

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

       // If entities.count > 0, some operations here
   }
现在尝试在自动释放池块之后直接记录实体


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

我预计会出现静态分析器警告,提示“实体永远不会被读取”。我遗漏了什么吗?在这个方法的范围内,“实体”的用途是什么?@Bamsworld你是对的,我遗漏了一些代码。编辑了代码片段。感谢您的澄清。谢谢,所以。。。只有当我希望得到一个包含要解析的对象的非常大的文件时,我才会使用
@autorelease
?问题是我事先不知道这样的文件中会有多少对象。为了以防万一,保留´@autorelease`块是否更好?你的问题的答案是:“也不完全正确”。关于大量数据:如果您使用一个NSData实例,它将被释放(当您停止使用它时),或者如果您将数据分配到一个实例,它将被强引用保留。无缘无故地保留@autorelease作用域是一种过分的做法。这完全取决于您使用了多少个“自动释放标记”对象,以及您计划在作用域末尾对这些对象执行什么操作。关于StackOverflow的讨论已经很多了:。希望能有帮助。非常感谢你的解释