В дополнение к возможности ссылки на делегата, вы также должны проверить любые блоки, в которых используете свой контроллер, и всегда использовать слабую ссылку на это, когда внутри блока.
От компании Apple docs:
Давайте предположим, что вы собираетесь сделать запрос HTTP и отображать информацию о пользователе, который вы получаете от сервера, на ваш взгляд зрения контроллера.
- (void)requestUserInfo
{
[self.client makeGETRequest:@"http://example.org/user/1/" usingBlock:^(User *user, NSError *error) {
if (error) {
[self.errorView displayWithError:error];
}
else {
self.userView.user = user;
[self.userView setNeedsLayout];
}
}];
}
В этом случае, когда пользователь становится скучно ожидания запроса, чтобы вернуть результат и отводы кнопку «Назад», чтобы просто закрыть страницу, вид контроллера не будет освобождаться, пока запрос не выполняется загрузка и выполнение блока , Вы можете видеть это сами, переопределяя dealloc
.
Таким образом, если не требуется, всегда используйте __weak
ссылки на self
внутри блоков.
- (void)requestUserInfo
{
__weak UIViewController *weakSelf = self;
[self.client makeGETRequest:@"http://example.org/user/1/" usingBlock:^(User *user, NSError *error) {
if (error) {
[weakSelf.errorView displayWithError:error];
}
else {
weakSelf.userView.user = user;
[weakSelf.userView setNeedsLayout];
}
}];
}
Что вам говорят инструменты? – quellish
При использовании ARC не предоставляется, что объекты будут немедленно выпущены.Вы случайно держите ссылку на контроллеры где-то в другом месте? – mAu
Вы устанавливаете 'navigationController = nil;' где-нибудь? Пожалуйста, разместите весь свой код, который ссылается на переменную 'navigationController'. –