2

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

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

т.е. если я это сделать:

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

Do myvc и request.delegate Теперь == указатель на ноль?

Это проблема, связанная с самообучением ... Я немного не понятен в некоторых базовых понятиях.

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

ответ

3

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

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

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

+0

Большое спасибо за этот ответ. Очень полезно. Моя текущая стратегия - это общая очередь загрузки, но каждый контроллер удаляет ее загрузки из очереди, если она закрыта. Кажется, хорошо работает до сих пор ... –