удаление делегата на dealloc без переменной экземпляра - PullRequest
1 голос
/ 29 сентября 2011

, поэтому я запускаю ASIFormDataRequest на моем [viewDidLoad] в UIViewController.

ASIFormDataRequest *detailRequest = [ASIFormDataRequest requestWithURL:url];
detailRequest.delegate = self;
[detailRequest startAsynchronous];

Если мой UIViewController будет выпущен до того, как мой запрос завершится, мое приложение вылетит.

Если я добавлю свой ASIFormDataRequest в качестве переменной экземпляра, например

@property(nonatomic, retain) ASIFormDataRequest *detailRequest;

и ноль делегата на dealloc

-(void)dealloc {
    if(self.detailRequest != nil) { self.detailRequest.delegate = nil; }
    self.detailRequest = nil;

    [super dealloc];
}

приложение больше не падает.

но я не думаю, что для этого нужно создавать переменную экземпляра, особенно если у меня несколько запросов.

Есть ли лучший способ сделать это?

Ответы [ 5 ]

1 голос
/ 29 сентября 2011

Я обычно создаю массив и храню все активные запросы в массиве. Когда запрос завершен, я удаляю запрос, а когда контроллер вызывает Deloc, я отменяю все запросы и ноль делегата.

0 голосов
/ 29 сентября 2011

Поскольку это асинхронный запрос, то, если вы установите делегат, это означает, что как только ответ придет, будут вызваны ваши методы делегата.До этого времени ваш объект должен быть живым, чтобы обработать ответ.Так что сохранение его и освобождение в dealloc - это хорошо, и перед этим вы должны установить делегат на ноль.Таким образом, если ответ приходит после освобождения метода, фреймворк не следует вводить в заблуждение при поиске метода мертвого объекта.

Для обработки нескольких запросов лучший способ - создать массив и количество объектов, которые вы хотите использовать.Когда вы закончите с объектами, в методе dealloc переберите каждый объект и установите делегат nil и отпустите объект.

0 голосов
/ 29 сентября 2011

Вы можете сделать это:

detailRequest.delegate = [self retain];

, а затем позвоните

[self autorelease];

В методе обратного вызова ASIFormDataRequest. Во всяком случае, это то, что я обычно делаю.

Таким образом, объект запроса сохраняет свой делегат на время запроса.

0 голосов
/ 29 сентября 2011

Делая self.detailRequest = [ASIFormDataRequest requestWithURL:url]; Я предполагаю, что это создает autorelease объект, срок жизни которого не привязан к вашему классу контроллера. Если создание и удаление вашего объекта связано с вашим контроллером, логично использовать переменную экземпляра.

Подробнее об автоматическом выпуске

0 голосов
/ 29 сентября 2011

Чтобы выпустить его, у вас должен быть указатель на него, так что да, используйте ивар. Баночки не дорогие.

...