Управление памятью и асинхронные операции: когда объект становится нулевым?
У меня есть представление, которое будет отображать загруженные изображения и текст. Я хотел бы обрабатывать все загрузки асинхронно с помощью ASIHTTPRequest, но я не уверен, как уведомить представление, когда загрузка завершена...
Если я передам свой контроллер вида в качестве делегата ASIHTTPRequest, а затем мой вид будет уничтожен (пользователь перемещается прочь), будет ли он изящно отказывать, когда он пытается передать сообщение моему контроллеру вида, потому что делегат теперь равен нулю?
То есть, если я это сделаю это:
UIViewController *myvc = [[UIViewController alloc] init];
request.delegate = myvc;
[myvc release];
Сделайте мою просьбу.делегировать сейчас = = указатель на ноль?
В этом и заключается проблема самообразования... Я немного расплывчата в некоторых основных понятиях.Приветствуются и другие идеи о том, как с этим справиться.
1 ответ:
Обновление: глядя на исходный код для ASIHTTPRequest , он не сохраняет свой делегат, поэтому ваш код должен либо убедиться, что делегат не был освобожден, либо установить свойство делегата запроса в
nil
перед освобождением контроллера.Если вы собираетесь запустить несколько асинхронных HTTP-запросов, может быть хорошей идеей создать класс
HTTPRequestManager
, который будет выступать в качестве делегата для всех ваших HTTP-запросов. ЭтоHTTPRequestManager
класс будет оставаться в памяти в течение всего срока службы вашего приложения, и он может позаботиться о том, чтобы избежать сбоя, если/когда ваши контроллеры представления будут выпущены.Я хотел бы добавить разъяснение по поводу управления памятью Cocoa с учетом ссылок. Важно помнить, что освобожденный Объект не автоматически устанавливается в
nil
. Отправка сообщения вnil
совершенно законна (и просто ничего не делает), но отправка сообщения в удаленный объект не определена поведение. Сохранение указателя на удаленный объект вызывает проблемы, и такие живые/мертвые указатели называются зомби.