NSString componentsSeparatedByString: возвращает автоматически освобожденный массив? - PullRequest
0 голосов
/ 25 ноября 2010

В следующем методе я не уверен, почему освобождение одного из массивов приводит к исключению. Единственная причина, по которой я мог видеть, это то, что componentsSeparatedByString возвращает автоматически освобожденный массив, но я не вижу, чтобы в документации упоминалось, что он делает.

-(void)addRow:(NSString *)stringWithNumbers;
{

    NSArray *numbers = [stringWithNumbers componentsSeparatedByString:@" "];
    NSMutableArray *row = [[NSMutableArray alloc] initWithCapacity:[numbers count]];
    for (NSString *number in numbers) {
        Number *n = [[Number alloc] initWithNumber:number];
        [row addObject:n];
        [n release];
    }
    [rows addObject:row];
    [row release];
//    [numbers release];  <-- leads to exception
}

Может ли кто-нибудь подтвердить, что массив автоматически освобожден? Если так, как я могу знать / почему я должен был знать?
Можно ли проверить, является ли какой-либо один экземпляр объекта автоматически выпущенным или нет по коду?

Ответы [ 3 ]

11 голосов
/ 25 ноября 2010

Да, потому что название метода:

  • не начинается с new
  • не начинается с alloc
  • не retain
  • не содержит copy

Это широко известно как правило "NARC" и полностью объясняется здесь: http://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmObjectOwnership.html#//apple_ref/doc/uid/20000043-SW1

0 голосов
/ 25 ноября 2010

По соглашению все методы с init или copy в своих именах возвращают неавторизованные объекты.

0 голосов
/ 25 ноября 2010

, если вы специально не выделите память, системный метод вернет вам автоматически выпущенный метод.

...