Управление памятью и асинхронные операции: когда объект становится нулевым?


У меня есть представление, которое будет отображать загруженные изображения и текст. Я хотел бы обрабатывать все загрузки асинхронно с помощью ASIHTTPRequest, но я не уверен, как уведомить представление, когда загрузка завершена...

Если я передам свой контроллер вида в качестве делегата ASIHTTPRequest, а затем мой вид будет уничтожен (пользователь перемещается прочь), будет ли он изящно отказывать, когда он пытается передать сообщение моему контроллеру вида, потому что делегат теперь равен нулю?

То есть, если я это сделаю это:

UIViewController *myvc = [[UIViewController alloc] init];
request.delegate = myvc;
[myvc release];

Сделайте мою просьбу.делегировать сейчас = = указатель на ноль?

В этом и заключается проблема самообразования... Я немного расплывчата в некоторых основных понятиях.

Приветствуются и другие идеи о том, как с этим справиться.

1 2

1 ответ:

Обновление: глядя на исходный код для ASIHTTPRequest , он не сохраняет свой делегат, поэтому ваш код должен либо убедиться, что делегат не был освобожден, либо установить свойство делегата запроса вnil перед освобождением контроллера.

Если вы собираетесь запустить несколько асинхронных HTTP-запросов, может быть хорошей идеей создать класс HTTPRequestManager, который будет выступать в качестве делегата для всех ваших HTTP-запросов. Это HTTPRequestManager класс будет оставаться в памяти в течение всего срока службы вашего приложения, и он может позаботиться о том, чтобы избежать сбоя, если/когда ваши контроллеры представления будут выпущены.

Я хотел бы добавить разъяснение по поводу управления памятью Cocoa с учетом ссылок. Важно помнить, что освобожденный Объект не автоматически устанавливается в nil. Отправка сообщения в nil совершенно законна (и просто ничего не делает), но отправка сообщения в удаленный объект не определена поведение. Сохранение указателя на удаленный объект вызывает проблемы, и такие живые/мертвые указатели называются зомби.