2010-10-23 2 views
1

Будучи noob в Iphone dev, просто пытаюсь понять.Управление памятью IPhone NSMutableArray

В приведенном ниже коде, что происходит exaccty?

City *newCity = [[City alloc] init]; 
newCity.name = @"name"; 

NSMutableArray *array = [[NSMutableArray alloc] init]; 
[array addObject:newCity]; 

City *getCity = [array objectAtIndex:0]; 

[city release]; 
[array release]; 

При добавлении объекта в массив массив сохраняет или создает новый экземпляр?

Также, когда я делаю объектAtIndex для извлечения города. Должен ли я его отпустить? Я не предполагаю, что с тех пор, как я не владею им? Так я должен думать?

Также, когда я освобождаю массив, он выполняет итерацию по всему объекту в массиве и вызывает выпуск на этом объекте?

ответ

3

Все ваши предположения верны.

Если вы считаете, что с точки зрения собственности вы всегда будете правы (кроме некоторых хорошо задокументированных исключений).

City *newCity = [[City alloc] init]; //newCity is +1 
newCity.name = @"name"; //name +1 

NSMutableArray *array = [[NSMutableArray alloc] init]; //array +1 
[array addObject:newCity]; //new city +1 

City *getCity = [array objectAtIndex:0]; //no memory change 

[city release]; //assuming this was supposed to be newCity, newCity -1, 
[array release]; //array -1, array deallocs, calling release on all its objects, newCity -1, deallocs 
1

При добавлении объекта в массив массив сохранит объект.

И вы правы, что если вы используете - [NSArray objectAtIndex: idx], счет сохранения не увеличивается, вы не «владеете» объектом, который вы получаете, и вам не нужно его выпускать. Если, очевидно, вы не решили сохранить его после того, как получили его из массива.

И да, когда массив освобожден, он освободит каждый из объектов в массиве. (Это не то же самое, что сказать, что он выпустит их, когда вы отпустите массив. Это происходит только тогда, когда массив освобожден)

Смежные вопросы