Чтобы понять, что происходит, вам нужно понять, как работают viewWillAppear и viewWillDisappear.
Оба метода вызываются несколько раз в жизненном цикле контроллера представления, в зависимости от того, нажимаете ли вы / вынимаете контроллер вида, или есливы отображаете / отклоняете модал от контроллера представления.
Например:
- Push viewController A: viewDidLoad и viewWillAppear вызывается для viewController A
- Push viewController B из viewController A: viewWillDisappear вызывается для viewController A и viewDidLoviewWillAppear вызывается для viewController B
- Вызывает viewController B для возврата к viewController A: viewWillDisappear вызывается для viewController B, viewDidUnload вызывается для viewController B, dealloc вызывается для viewController B, viewWill *ppear вызывается для viewController B 1012 * *22 * вызывается для viewController 1013Отображение модального из viewController A: viewWillDisappear вызывается для viewController A
- Отключить модальное: viewWillAppear, вызываемое для viewController A
- Всплывающее представление viewController A: viewWillDisappear вызывается для viewController A, viewDidController вызывается для viewDidControlВызывается на viewController A
Звучит так, как будто вы выделяете объект в viewWillAppear, который вызывается несколько раз, но освобождает его в методе deallocd, который вызывается только один раз, следовательно, утечка памяти .
Освобождение вашего объекта в viewWillDisappear уравновешивает ресурсы в viewWillAppear, следовательно, утечки нет.
Все, что я могу сказатьна данный момент, если у вас нет очень веской причины выделять что-то в viewWillAppear (то есть вы знаете, что делаете), не делайте этого.
Больше я не могу вам сказать... размещение большего количества кода для того, что вы пытаетесь сделать, может помочь вам получить более сложный ответ:)
Надеюсь, что это помогло.
РЕДАКТИРОВАТЬ после того, как код был опубликован.
Прежде всего, вы имеете в виду «когда я раскомментирую [ count release]»?Не могли бы вы опубликовать консольное сообщение для этого сбоя?Это происходит сбой, потому что parserDidEndElement находится там, где он размещен, но он становится доступным в viewWillDisappear.Если они не сбалансированы, вы получите EXC_BAD_ACCESS
в зависимости от ситуации с памятью.Теперь я вижу, почему выпуск в viewWillDisappear исправляет утечки.Вы вызываете fetchsuggestions
для viewWillAppear, который, в свою очередь, создает и запускает запрос URL.Это приведет к connectionDidFinishLoading
вызову при успешном соединении.Здесь вы размещаете различные ивары.Поскольку я упоминал ранее, что viewWillAppear вызывается несколько раз, это означает, что вы запускаете соединение несколько раз, что приводит к тому, что connectionDidFinishLoading
вызывается несколько раз.
Именно поэтому выпуск в viewWillDisappear
исправляетутечки, потому что для каждого выделения в viewWillAppear
вы балансируете его, выпуская в viewWillDisappear
.
Что вы пропустили, хотя , так это то, что ваша программа потерпит крах, когда нет доступной сети.Это потому, что connectionDidFinishLoading
не будет вызван, когда нет сети.Теперь, когда вы попытаетесь выпустить в viewWillDisappear
, вы получите EXC_BAD_ACCESS, когда вы пытаетесь освободить ранее освобожденные экземпляры, которые никогда не были распределены снова в viewWillAppear
.
Я не думаю, что вижуМне нужно вызывать fetchsuggestions
несколько раз в viewWillAppear, если вы не делаете это намеренно.
Это самая яркая вещь, которую я вижу сейчас ... проблемы могут быть (и, вероятно, являются) множественными, нокак насчет того, чтобы начать с реструктуризации кода, помня о том, что несколько несбалансированных распределений и выпусков внутри viewWillAppear / Disappear может не быть хорошей идеей ...?:)