簡體   English   中英

在我的方案和ARC中,@ autoreleasepool是否有意義?

[英]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執行此操作,因為我找到了一個執行此操作的示例,但是我不確定是否真的有必要...有人可以解釋一下使用@autoreleasepool和不使用它之間的區別是什么嗎?

非常感謝

編輯:應該在@autoreleasepool塊內定義entities數組嗎?

@autorelase語句暗含創建一個自動釋放池,該池將包含所有標記為自動釋放的對象,范圍為@autorelease{} 因此,僅當有相當數量的帶有自動釋放標記的對象時才使用@autorelease是有意義的(不僅需要即時內存釋放,而且還需要避免“內存高峰”)。 內存分配和釋放是一個很大的主題,將在單個文章中進行解釋,但是主要規則是:如果作用域將包含大量帶有自動釋放標記的對象,則對范圍使用@autorelease

由於實體是在方法范圍內聲明的,而不是在自動釋放池塊中聲明的 ,因此您可以強有力地指向自動釋放池塊之外的實體 ,在這種情況下, 自動釋放池將無效。

為了驗證這一點,請嘗試在方法返回之前記錄實體

為了使自動釋放池塊具有某些含義,請在自動釋放池塊中聲明實體

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

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

現在,嘗試在自動釋放池塊之后立即記錄實體

如果實體很小,這種情況就很簡單了,但是包含它並不是一件壞事,因為它可以幫助擴展性,因為這種方法會隨着時間的推移而發展,並且自動釋放塊會開始做更多的事情。 如果實體可能很大,那么您絕對想要池。 我的建議是離開自動釋放池塊,並在池塊內移動實體的聲明。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM