iPhone: вернуть NSMutableArray в методе, все еще выпуская - PullRequest
1 голос
/ 01 октября 2010

Я пытаюсь понять немного больше об управлении памятью.Зная, что мне нужно выпустить все, что у меня есть init или alloc'ed, я запутался в следующем:

- (NSMutableArray *)getData {
    NSMutableArray *data = [[NSMutableArray alloc] init];
    NSString *first = @"First object";
    [data addObject:first];
    NSString *second = @"Second object";
    [data addObject:second];

    return data;

}

Поскольку я использовал alloc и init, я знаю, что мне нужно освободить мой объект данных.Но если я добавляю autorelease в часть init или в return, он вылетает при запуске метода.

Как правильно сделать что-то подобное с правильным управлением памятью для iPhone?

Ответы [ 3 ]

3 голосов
/ 01 октября 2010

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

NSMutableArray *array = [[obj getData] retain];

Позже, когда все будет полностью завершено:

[array release]; // balances the retain above
2 голосов
/ 01 октября 2010

Вы на правильном пути.Каждое alloc / init следует связывать с release или autorelease, что приведет к очистке объекта, как только окончательная ссылка на него исчезнет.

Шаблонкак то так:

- (SomeObject*)generateSomeObject
{
    SomeObject* someObject = [[[SomeObject alloc] init] autorelease];
    ...
    return someObject;
}
0 голосов
/ 01 октября 2010

Вы присваиваете результат этого метода переменной экземпляра? Имейте в виду, что вещи, добавленные в пул автоматического выпуска, будут выпущены в какой-то момент в будущем (обычно в конце цикла выполнения), поэтому, если вы назначите его переменной экземпляра, и конец цикла выполнения наступит, ваша переменная экземпляра в конечном итоге будет указывать на мусор (или иногда на другой объект), если вы не сохраните it.

Имя метода (getData) предполагает, что возвращаемый объект должен быть автоматически освобожден, поэтому вы можете создать массив с [NSMutableArray array], заполнить его как обычно, а затем вернуть его из метода.

Если код, который вызывает getData, хочет, чтобы массив пережил итерацию цикла выполнения, ему нужно retain, но также он должен убедиться, что release массив, когда он наконец завершится это - это обычно делается в вашем dealloc методе.

...