Это не для того, чтобы отвлечься от существующих ответов, а для того, чтобы обратиться к вашему редактированию (что, кстати, должно ДЕЙСТВИТЕЛЬНО быть отдельным вопросом.):
Они сохранили объект NSNumber и никогда не были освобождены, это нормально?
- (void)setCount:(NSNumber *)newCount {
[newCount retain];
[_count release];
// Make the new assignment.
_count = newCount;
}
Ну, не было бы, если бы это было то, что они сделали.
Вы путаете указатели с объектами. Вы видите (NSNumber *)
как раз перед newCount. Это *
означает, что newCount является указателем на объект NSNumber. Разрешите мне перевести.
[newCount retain];
Сохранить объект, на который указывает указатель 'newCount'.
[_count release];
Отправьте сообщение об освобождении объекту, на который в данный момент указывает указатель _count.
_count = newCount;
Заставить указатель '_count' ссылаться на объект, на который ссылается указатель 'newCount'
Думайте об этом так, если у вас есть машина, которую вы, скорее всего, просто назовете myCar
. Когда вы говорите myCar
, вы имеете в виду свою машину, машину, которой вы владеете. Допустим, вы на какое-то время покупаете новый автомобиль, назовете его newCar
, чтобы вы могли увидеть разницу. Таким образом, вы получаете право собственности на свой новый автомобиль [newCar retain]
, и на короткое время у вас есть два автомобиля. Теперь вы продаете свою старую машину, которую вы до сих пор называете myCar
, [myCar release]
(очень грустно). Но теперь, когда вы говорите myCar, вы имеете в виду ваш новый автомобиль myCar = newCar
. У вас больше нет своей старой машины. И теперь ваш новый автомобиль - просто мой автомобиль, и вы владеете им. Когда ты умрешь, dealloc
, твоя машина будет продана, [myCar release].