2017-02-13 12 views
1

У меня есть класс NSObject 'DataDownload_A' для загрузки данных. Внутри я использую NSURLSession и NSURLSessionTask. Теперь проблема заключается в том, что когда я устанавливаю этот объект в nil, dealloc не будет вызываться. Вот фрагмент кода из DataDownload_A:Объект dealloc не вызывается, если NSURLSessionTask резюме вызвано

NSString *urlString = [self URL]; 
    NSURL *url    = [NSURL URLWithString:urlString]; 
    NSURLRequest *theRequest = [NSURLRequest requestWithURL:url 
               cachePolicy:NSURLRequestUseProtocolCachePolicy 
              timeoutInterval:60.0]; 

    NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; 

    self.session = [NSURLSession sessionWithConfiguration:configuration 
               delegate:self 
              delegateQueue:nil]; 
    self.receivedData = [NSMutableData data]; 

    self.task = [self.session dataTaskWithRequest:theRequest]; 
    [self.task resume]; 

И если я комментирую последние две строки 'self.task = [self.session dataTaskWithRequest: theRequest];' и '[self.task resume];', будет вызываться dealloc. Поэтому я предполагаю, что некоторые проблемы возникают, когда я их использую. Я пытался называть '[self.task cancel]', 'self.task = nil', '[self.session invalidateAndCancel];' и '[self.session resetWithCompletionHandler: nil];' прежде чем я установлю свой объект на ноль. Но не помогло.

Так кто-нибудь знает, какую ошибку я сделал? Было бы благодарно сообщить мне. Заранее спасибо.

+0

Хм, я удалил свой ответ, но ваша задача [task cancel] и task = nil, должна вызвать dealloc, но похоже, что у вас может быть что-то еще, содержащее сильную ссылку на ваш «DataDownload_A», вы должен опубликовать код для вашего вызывающего абонента DataDownload_A. –

+0

спасибо. Скрытность. Я попробую. –

ответ

2

Похоже, что URLSession имеет прочную ссылку на своего делегата. Я нашел эту строку в документации на URLSession:

Важно: объект сессии держит сильную ссылку на делегат , пока приложение явно обесценивает сессию. Если вы не сделали , аннулируйте сеанс, ваше приложение потеряет память.

Этот бит делает это звучит как URLSession держит сильную ссылку на его делегатом от момента она создана, пока не будет признана недействительной или приложение завершается, но это может быть, что это только создает сильную ссылку, когда данные (или другой) задачи.

Похоже, вам нужно аннулировать URL-адрес, чтобы заставить его освободить его делегата. Я предлагаю искать этот текст в документах URLSession в Xcode. Также выполните поиск по «invalidate»

+0

Привет, Duncan C .. ваш ответ довольно близок к решению моей проблемы, и это вдохновило меня проверить мою переменную сеанса. Я вызывал сеанс недействительным до того, как установил мой объект в nil ... но мой сеанс настроен на «сохранить». поэтому после того, как он вернулся к «сильному», он работает для dealloc. Спасибо. –