Что удерживает запрос? (Операционная очередь, возможно? Кто знает?)
В общем, метод "выстрели и забудь и дай мне обратный вызов", который ты, похоже, предлагаешь, - плохая идея. Если ничто не удерживает VC отдельно от запроса, тогда (если структура вашего приложения не является немного глупой), VC никогда не будет ничего делать с данными, которые он получает, поэтому нет никаких оснований для его продолжения.
Это также кажется неправильным: имеет ли запрос VC, или VC владеет запросом? Я ожидаю последнего, поэтому VC также должен сохранить запрос.
Есть несколько исключений:
- CAAnimation.delegate сохраняется, предположительно потому, что анимация в какой-то момент завершится (я не уверен, что произойдет, если это повторяющаяся анимация). То же самое может быть верно для делегата анимации UIKit
- NSTimer сохраняет свою цель, вероятно, потому что NSInvocation делает. (Я написал класс «слабого таймера», чтобы обойти это.)
- CADisplayLink сохраняет свою цель, предположительно похожую на NSTimer.
В этих случаях я часто работаю с классом «слабого прокси», который не сохраняет свою цель (и я написал обертки «слабого таймера» вокруг NSTimer / CADisplayLink, чтобы сделать это немного проще).
То, что вы должны сделать, это отслеживать запросы, которые вы инициировали, и в dealloc сделать что-то вроде
request.delegate = nil;
[request cancel];
self.request = nil;
Точно так же вы должны отменить регистрацию для уведомлений / действий / обратных вызовов KVO в соответствующее время. Есть исключение:
- Если вы уверены, что он не отправит вам обратный вызов после того, как вы его отпустите, вам не нужно об этом беспокоиться, поэтому делегаты текстовых полей и действия / цели кнопки не нужно очищать.
Есть исключения из исключения:
- UIWebView (по крайней мере, в старых ОС) также сохраняется чем-то другим, возможно, чем-то связанным с веб-потоком. Может произойти сбой, если VC исчезает, когда веб-представление все еще загружается.
- Обратные вызовы прокрутки UIScrollView также приводят к тому, что представление сохраняется после срока службы VC. Вы можете проверить это, например, удерживая нажатой кнопку «Готово» и начиная щелчок «Готово».