Это хорошо, чтобы несколько объектов сохранили тот же объект в Objective-C/Cocoa?

Скажите, что у меня есть tableview класс, который перечисляет 100 объектов Foo. Это имеет:

@property (nonatomic, retain) NSMutableArray* fooList;

и я заполняю его Foos как:

self.fooList = [NSMutableArray array];
while (something) {
  Foo* foo = [[Foo alloc] init];
  [fooList addObject:foo];
  [foo release];
}

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

Затем, если пользователь выбирает одну определенную строку в таблице, и я хочу отобразить представление Foo детали, которое я называю:

FooView* localView = [[FooView alloc] initWithFoo:[self.fooList objectAtIndex:indexPath.row]];  
[self.navigationController pushViewController:localView animated:YES];
[localView release];

Теперь класс FooView имеет:

@property (nonatomic, retain) Foo* theFoo;

таким образом, теперь ОБА массив держатся за то Нечто, а также FooView. Но это хорошо кажется правильным? Когда пользователь совершит нападки, кнопка "Назад" к dealloc обратятся, FooView и [theFoo выпуск] назовут. Затем другая кнопка "Назад" поражена, и dealloc называют на tableview классе, и [fooList выпуск] назван.

Вы могли бы утверждать, что класс FooView должен иметь:

@property (nonatomic, assign) Foo* theFoo;

по сравнению с сохраняют. Но иногда класс FooView называют с Нечто, это не находится также в массиве. Таким образом, я хотел удостовериться, что это должно было хорошо иметь два объекта, держащиеся за тот же другой объект.

6
задан Andrew Arrow 26 April 2010 в 17:29
поделиться

3 ответа

Как говорят другие, то, что вы делаете, правильно, и код мне кажется правильным. У меня есть десятки ссылок на один и тот же объект в моем коде, и пока я сбалансировал все удержания и выпуски, все работает нормально.

Чтобы добавить немного подробностей ... вы спрашиваете:

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

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

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

Как говорят другие ... прочтите руководство по управлению памятью и попрактикуйтесь. :) О, и прочитайте также код других людей с этой точки зрения и попытайтесь понять, как / почему они осуществляют управление своей памятью.

Еще одна мелочь ... для каждого сохраненного свойства убедитесь, что у вас есть вызов освобождения в методе dealloc объекта.

4
ответ дан 8 December 2019 в 18:34
поделиться

Да, нормально. В этом вся суть системы управления памятью с подсчетом ссылок.

4
ответ дан 8 December 2019 в 18:34
поделиться

Чтобы ответить на ваш главный вопрос, да, вы можете несколько объектов сохранить экземпляр. В этом и заключается суть управления памятью с подсчетом ссылок. Взгляните на Руководство по программированию управления памятью Какао для получения дополнительной информации. Тогда перечитайте это. У него есть ответы на все вопросы, и он станет вашим лучшим другом.

По сути, отправка сообщения -retain указывает, что отправитель «владеет» получателем в том смысле, что получатель не должен быть освобожден до тех пор, пока все владельцы не освободят свое владение. Таким образом, отдельным экземплярам не нужно знать (и это не должно их волновать), существуют ли другие владельцы. Сохраните все, что вам нужно, и отпустите, когда закончите с этим. Когда все владельцы освободят свое владение, счет может быть освобожден.

Кстати,

@property (retain,readwrite) NSMutableArray *myArray;

заявляет, что класс, объявляющий это свойство, сохранит экземпляр NSMutableArray . NSArray , NSDictionary и NSSet (и их изменяемые подклассы) всегда сохраняют свое содержимое.

5
ответ дан 8 December 2019 в 18:34
поделиться