@autoreleasepool 在我的场景和 ARC 中是否有意义?
Does @autoreleasepool make sense in my scenario and in ARC?
我解析文件的内容以便在上下文中创建一组 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
中执行此操作,因为我找到了一个这样做的示例,但我不确定是否真的有必要...有人可以解释一下使用 [= 之间的区别吗15=] 而不是使用它应该是?
非常感谢
编辑: entities
数组是否应该在 @autoreleasepool
块内定义?
@autorelase
语句意味着创建一个自动释放池,该池将包含在 @autorelease{}
范围内标记为自动释放的所有对象。因此,当且仅当存在相对大量的自动释放标记对象时,使用 @autorelease
才有意义(它不仅需要即时内存释放,而且还需要避免 "memory peaks" )。内存分配和释放是一个很大的话题,需要用一个 post 来解释,但主要规则是:如果范围包含大量自动释放标记的对象,请使用 @autorelease
。
因为 entities 是在方法的范围内声明的,而不是在 autorelease pool 块 中声明的,所以你有一个指向 entities 在 autorelease pool block 之外,在这种情况下 auto release pool 将无效。
要验证这一点,请尝试在方法 returns.
之前记录 entities
要使自动释放池块具有一定意义,请在自动释放池块实体中声明实体 =34=].
@autoreleasepool {
NSMutableArray *entities = [self parseEntitiesFileContent:entitiesFileContent inContext:context];
// If entities.count > 0, some operations here
}
现在尝试在自动释放池块之后直接记录 entities。
如果 entities 很小,这种情况就相当微不足道了,但是包含它也不错,因为它可能有助于可扩展性,因为这种方法可能会随着时间的推移和自动发布而发展块开始做更多。如果 entities 可能很大,那么您绝对需要这个池。我的建议是保留自动释放池块并将 entities 的声明移到池块中。
我解析文件的内容以便在上下文中创建一组 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
中执行此操作,因为我找到了一个这样做的示例,但我不确定是否真的有必要...有人可以解释一下使用 [= 之间的区别吗15=] 而不是使用它应该是?
非常感谢
编辑: entities
数组是否应该在 @autoreleasepool
块内定义?
@autorelase
语句意味着创建一个自动释放池,该池将包含在 @autorelease{}
范围内标记为自动释放的所有对象。因此,当且仅当存在相对大量的自动释放标记对象时,使用 @autorelease
才有意义(它不仅需要即时内存释放,而且还需要避免 "memory peaks" )。内存分配和释放是一个很大的话题,需要用一个 post 来解释,但主要规则是:如果范围包含大量自动释放标记的对象,请使用 @autorelease
。
因为 entities 是在方法的范围内声明的,而不是在 autorelease pool 块 中声明的,所以你有一个指向 entities 在 autorelease pool block 之外,在这种情况下 auto release pool 将无效。
要验证这一点,请尝试在方法 returns.
之前记录 entities要使自动释放池块具有一定意义,请在自动释放池块实体中声明实体 =34=].
@autoreleasepool {
NSMutableArray *entities = [self parseEntitiesFileContent:entitiesFileContent inContext:context];
// If entities.count > 0, some operations here
}
现在尝试在自动释放池块之后直接记录 entities。
如果 entities 很小,这种情况就相当微不足道了,但是包含它也不错,因为它可能有助于可扩展性,因为这种方法可能会随着时间的推移和自动发布而发展块开始做更多。如果 entities 可能很大,那么您绝对需要这个池。我的建议是保留自动释放池块并将 entities 的声明移到池块中。