Подождите. Стоп. Ответ Msaeed является правильным, построчно, но не в состоянии подчеркнуть реальную проблему.
Вы либо не мыслите как компьютер, либо вы принимаете слишком много магии на строку кода.
Пожалуйста, не воспринимайте это как оскорбление - это очень простая ошибка, которую допускает почти каждый программист, когда только знакомится с окружением (я сделал несколько действительно фантастических магических предположений, когда начинал с Objective-C в 1989).
Давайте пересмотрим ситуации.
СИТУАЦИЯ № 1:
... удалить ненужный код ...
foo = fooToo;
Это простое задание. Все, что foo
содержалось до этого - ссылка на объект в вашем случае - теперь будет перезаписано значением fooToo
. Там нет магии. Не требуется выполнение дополнительных методов или строк кода.
Если foo
содержит ссылку на сохраненный объект, pior этой строки кода. Ссылка будет перезаписана. Если вам нужно release
foo
перед перезаписью ссылки, сделайте это, но это ортогонально назначению.
СИТУАЦИЯ № 2:
... удалить ненужный код ...
-(void)dealloc{
[super dealloc];
[foo release];
}
Играй в компьютер; вы запрашиваете super для dealloc, а затем предполагаете, что переменная экземпляра действительна после освобождения super. Плохие новости. Boom.
Здесь нет магии. foo
является ссылкой от до self на переменную экземпляра. -dealloc
уничтожает себя и, таким образом, foo
больше не действует.
(Я полагаю, статический анализатор поймает это. Если нет, то должен.)
СИТУАЦИЯ № 3:
См. № 2. Это точно такая же проблема. Вы получаете доступ к переменной экземпляра экземпляра, который больше не является допустимым.
СИТУАЦИЯ № 4:
self.foo = bar;
Точно так же, как:
`[self setFoo: bar];
(кроме любого сеттера = махинации)
Таким образом, ключевое отличие заключается в том, что делает реализация - рукописная или @synthesized - из -setFoo :. В твоем случае это retain
с бар. Что отличается от foo = bar;
тем, что никакого сохранения не происходит; это просто присвоение ссылки на bar
.
Я настоятельно рекомендую вам вернуться к вводной документации Objective-C. Это поможет Тем не менее, я также призываю вас сделать шаг назад и по-настоящему продумать, что именно делает каждая строка кода в вышеуказанных ситуациях. В этом нет магии, и фактическое поведение очень простое.