0

Я написал пример кода для подключения к серверу. Пожалуйста, найдите код, который я написал ниже.Слабый сам получает нуль внутри блока, но я хочу использовать самообъект внутри блока.

__weak typeof(self) weakSelf = self; 
self.dataTask = [defaultSession dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) 
{ 
    weakSelf.dataTask = nil; 
    NSInteger extractionResponseCode = [((NSHTTPURLResponse *)response) statusCode]; 
    if (!error && data.length > 0 && extractionResponseCode == 200) 
    { 
     [weakSelf handleResponse:data]; 
    } 
    else 
    { 
     [weakSelf handleError:error]; 
    } 
}]; 

После получения ответа, я должен позвонить либо handleResponse: или handleError: на основе ответа.

Я взял weakSelf, чтобы избежать проблемы с циклом сохранения в ARC.

Моя проблема здесь в блоке weakSelf получает как ноль, так что ни handleResponse:, ни handleError: методы называются.

Не могли бы вы помочь мне, как я могу решить эту проблему?

Заранее спасибо.

ответ

2

Ответ заключается в том, чтобы зафиксировать сильную ссылку. В любом случае у вас нет цикла удержания, если только self не имеет ссылки на блок завершения. И сильная ссылка будет выпущена в любом случае, когда блок вернется, что сломает цикл, если у вас его будет.

0

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

Это не имеет никакого отношения к эталонному циклу: self будет уйти в конце концов, если вы не используете weakSelf, но вы не должны держать его в живых дольше, чем необходимо. В худшем случае вы можете показать предупреждение об ошибке на экране, который уже давно исчез. Ошибка запроса URL-адреса может занять 60 секунд, поэтому пользователь может сделать что-то совершенно другое.

Правильный способ использования weakSelf - назначить ему новую переменную strongSelf в вашем обратном вызове, а затем проверить, что она не равна нулю. Использование weakSelf напрямую плохо, потому что оно может стать нулем в любое время.

0

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

Поскольку термин сохраняется цикл, он может иметь только один, если у вас есть ссылка на объект, который ссылается на объект, содержащий первую ссылку (напрямую или через ряд других ссылок).

Таким образом, если контекст блока относится к self, у вас есть ссылочный цикл, если и только если блок ссылается на self. (BTW: Это относится ко всем (сильным) ссылкам. Нет ничего особенного в self в Objective-C, нигде.) У вас этого нет. Предотвращение циклов удержания не является причиной для ослабления self в вашем случае.

Однако некоторые хотят его ослабить, чтобы сделать selfnil в таком случае. Это намерение. Это может быть преимуществом при некоторых обстоятельствах: просто подумайте о модельном объекте, который исчезнет при загрузке данных для него. Нет причин держать его в живых.

Если вы этого не хотите, просто не ослабляйте self.Это есть это простой.