Когда выпустить NSString в iPhone

У меня есть следующий метод

   -(NSMutableArray *) getPaises {
     NSMutableArray * paises;
     paises = [[NSMutableArray alloc] init];
     while( get new row ) {
      NSString *aPais =  [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 0)];
      [paises addObject:aPais];
     }
     return paises;
    }

Я не выпускаю aPais, потому что, если я это сделаю, приложение выйдет из строя. Я не знаю, когда или если я должен его выпустить после использования, и если да, то как мне это сделать. Просто освободить NSMutableArray достаточно? Или мне нужно пройти его и выпустить каждый объект?

И если мне не нужно его выпускать, кто ответственен за освобождение?

Ответы

Ответ 1

Как сказал epatel, вам не нужно выпускать эту конкретную строку. Если вы хотите быть более активным, вы можете сделать это вместо этого:

-(NSMutableArray *) getPaises {
    NSMutableArray * paises;
    paises = [[[NSMutableArray alloc] init] autorelease];
    while( get new row ) {
        NSString *aPais =  [[NSString alloc] initWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 0)];
        [paises addObject:aPais];
        [aPais release];
    }
    return paises;
}

Вкратце:

  • [[NSString alloc] initWith...] → Вы должны освободить или автообновить.

  • [NSString stringWith...] → Не нужно выпускать.

- Edit: добавлено autorelease для paises, когда вы его возвращаете. Когда вы возвращаете объект, всегда проверяйте его, если у вас есть alloc & init'd.

Ответ 2

stringWithUTF8String: возвращает строку автозапуска, которая будет автоматически выпущена Cocoa в следующем eventloop. Но строка также сохраняется в массиве, когда вы выполняете addObject:... так что, пока она находится в массиве, она будет сохранена.