В книге «Изучите Objective-C на Mac» вы можете найти следующий код, который я считаю ошибочным:
«Вот еще одна попытка написания setEngine:
- (void) setEngine: (Engine *) newEngine
{
[engine release];
engine = [newEngine retain];
}
... обдумайте этот случай:
Engine *engine = [Engine new]; // count: 1
Car *car1 = [Car new];
Car *car2 = [Car new];
[car1 setEngine: engine]; // count: 2
[engine release]; // count 1
[car2 setEngine: [car1 engine]]; //Ops...
Почему это проблема?Вот что происходит.[car engine] возвращает указатель на engine, у которого счет сохранения равен 1. Первая строка setEngine - это [engine release], что делает счет сохранения 0, когда объект освобождается .... "
Однако, после прочтения этого параграфа на стр. 166. Интересно, какое отношение имеет внутренняя ссылка на двигатель в car2 к двигателю в car1. Это две разные ссылки и к тому времени "[car2 setEngine: [car1 engine]]"is invoke, двигатель в car2 не был инициализирован и не имеет никакого отношения к оставшемуся двигателю, о котором говорит автор. Таким образом," [выпуск двигателя] "не уменьшит значение счетчика до 0 для двигателя car1.это ошибка или я ужасно ошибаюсь?
((Я хотел бы обсудить этот конкретный код, а не правильный способ реализации установщика))