为什么这是保留周期?

问题描述 投票:-1回答:1

我对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()
        }
    }
}
ios swift automatic-ref-counting
1个回答
3
投票

从技术上讲,没有循环。

首先,NetworkHelper从来没有拥有任何东西,它只是通过封闭到Alamofire

Alamofire持有封闭,保留FeedViewController实例(作为self)。但是,Alamofire不归FeedViewController所有,因此没有循环。

确实,当请求正在运行时,FeedViewController无法解除分配,因为完成回调阻止了这一点,但这可能是预期的行为,并且肯定没有所有权周期。

© www.soinside.com 2019 - 2024. All rights reserved.