1) Мой вывод правильный?
Ваш вывод правильный. Руководство по программированию управления памятью объясняет, что у каждого объекта есть один или несколько владельцев.Вы владеете любым созданным вами объектом, используя любой метод, начинающийся с alloc
, new
, copy
или mutableCopy
.Вы также можете вступить во владение объектом используя retain.Когда вы закончите работу с объектом, вы должны отказаться от владения, используя release
или autorelease
.
Освобождение объекта не меняет значения любых переменных, которые ссылаются на этот объект.Ваша переменная содержит адрес памяти объекта до тех пор, пока вы не переназначите его, независимо от того, какое количество счетчиков у объекта.Даже если количество сохраняемых объектов обнуляется, в результате чего объект освобождается, ваша переменная все равно будет указывать на тот же адрес.Если вы попытаетесь получить доступ к объекту после того, как он был освобожден, ваше приложение обычно будет аварийно завершать работу с EXC_BAD_ACCESS.Это распространенная ошибка управления памятью.
2) Есть ли что-то еще важное, что можно из этого извлечь?
Ничего не приходит на ум.
3) Каковы сложности, вызванные сохранением (использованием) ffv и вызовом методов из ffv?(Мое мнение таково, что это нормально, поскольку представление всегда будет иметь ffv и не освободит его, пока кто-то не вызовет viewDidUnload. И до тех пор, пока я не передам ссылку ffv на другие объекты.)
Когда вы звоните release
, вы сообщаете среде выполнения Objective C, что вам больше не требуется доступ к объекту.Хотя может быть много случаев, подобных этому, в которых вы знаете, что объект все еще будет существовать, на практике вы действительно не должны обращаться к объекту после вызова release
.Вы бы просто искушали судьбу и настраивали себя на будущие ошибки.
Лично мне не нравится перетекать свой код заявлениями release
, потому что я не доверяю себе, чтобы запомнить их на 100%время.Вместо этого я предпочитаю автоматически высвобождать мои переменные, как только я распределю их следующим образом:
ffv = [[[FullFunctionView alloc] initWithFrame:self.view.bounds] autorelease];
Это гарантирует, что ffv будет существовать по крайней мере до конца метода.Он будет выпущен вскоре после этого, обычно перед следующей итерацией цикла выполнения.(Теоретически это может занять слишком много памяти, если вы размещаете большое количество временных объектов в узком цикле, но на практике я никогда не сталкивался с этим случаем. Если я когда-либо это сделаю, его будет легко оптимизировать.)