управление памятью с выходами и свойствами в контроллерах представления - PullRequest
2 голосов
/ 09 сентября 2010

Привет, ребята, извините, что снова избил лошадь управления памятью.Я знаю, что этот вопрос задавался несколько раз на SO, но я чувствую, что всем темам по-прежнему не хватает двух частей информации.Позвольте мне высказать то, что я ДЕЙСТВИТЕЛЬНО знаю, чтобы сэкономить время всем.

1) Когда вы создаете IBOutlet, ваш контроллер представления автоматически сохраняет эту розетку.

1a) Когда вы не создаетерозетка, 'framework' (перо?) высвобождает ваши объекты (например, uilabels или uiviews) для вас.

2) Когда вы делаете self.myOutlet = nil, вы фактически освобождаете розетку (при условии, что выправильно синтезировали ваши свойства).Это потому, что сеттер освобождает розетку и присваивает ей ноль.

Чего я не знаю:

1) ОСНОВНОЙ вопрос: если вы делаете self.myOutlet = nil в viewDidUnLoad,Вам все еще нужно что-то делать в dealloc?Можете ли вы сделать предположение, что viewDidUnload всегда вызывается перед dealloc? (И, следовательно, ваши сохраненные представления освобождаются?)

2) Что произойдет, если вы не синтезируете свойство для этого выхода?Разве фреймворк не должен выпускать его автоматически? (Так как у вас нет свойства retain). Если вам нужно его освободить, как вы это делаете и где (в viewDidUnload или dealloc)?

Если что-тонеправильно, пожалуйста, укажите мне.Любые разъяснения были бы очень полезны.

1 Ответ

1 голос
/ 09 сентября 2010

(# 1) Документы Apple говорят, чтобы сделать оба

Кроме того, из-за подробностей реализации dealloc в UIViewController вы должны также установить переменные выхода равными nil в dealloc:

http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmNibObjects.html

(# 2) Если вы не синтезируете свойство, вам все равно нужно создать свойство, и его лучше сохранить - прочитайте ссылку. Объект пользовательского интерфейса создан, автоматически освобожден и установлено свойство outlet (которое должно сохраняться). Релиз для вас не требуется, потому что он уже выполнил релиз, который должен был сделать - вы его сохранили, поэтому вы должны выпустить (и в viewDidUnload, и в dealloc)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...