Почему это удерживающий цикл? - PullRequest
0 голосов
/ 04 марта 2019

У меня есть базовое понимание ARC, но в следующем примере я неожиданно запутался.

FeedViewController имеет строгую ссылку NetworkHelper, тогда у NetworkHelper есть функция, которая принимает закрытиеи назовите его позже.

Так вот путаница: замыкание передается от FeedViewController к NetworkHelper, и этот блок не сохраняется внутри NetworkHelper, так почему NetworkHelper имеет сильныйссылка NetworkHelper?об этом говорится в статье, но я просто не могу понять, почему.Это имеет смысл для меня только в том случае, если NetworkHelper сохранит сильную ссылку на блок.

class NetworkHelper {
    func getFeed(completion: @escaping ([FeedItem]) -> Void) {
        Alamofire.request(…).responseJSON { (response) in
            if let value = response.result.value {
                if let json = JSON(value)[Constants.items].array {
                    completion(json.flatMap(FeedItem.init))
                }
            }
        }
    }
}

class FeedViewController {
    var tableView: UITableViewController
    var feedItems: [FeedItem]
    var networkHelper: NetworkHelper
    override func viewDidLoad() {
        ...
        networkHelper.getFeed() { items in
            self.feedItems = items
            self.tableView.reloadData()
        }
    }
}

1 Ответ

0 голосов
/ 04 марта 2019

Технически, цикл отсутствует.

Прежде всего, NetworkHelper никогда ничего не владеет, он просто передает замыкание в Alamofire.

Alamofire удерживает это замыкание, который сохраняет экземпляр FeedViewController (как self).Однако Alamofire не принадлежит FeedViewController, поэтому цикл отсутствует.

Это правда, что во время выполнения запроса FeedViewController не может быть освобожден, поскольку обратный вызов завершения предотвращает это, но это можетбыть ожидаемым поведением и определенно нет цикла владения.

...