繁体   English   中英

为什么这是一个保留周期?

[英]Why is this a retain cycle?

我对ARC有基本的了解,但是在以下示例中,我突然感到非常困惑。

FeedViewController具有NetworkHelper的强大参考,然后NetworkHelper具有接受闭包并稍后调用的函数。

因此,这里的困惑:封从传递FeedViewControllerNetworkHelper ,而这个块不被保留里面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()
        }
    }
}

从技术上讲,没有周期。

首先, NetworkHelper从不拥有任何东西,它只是将闭包传递给Alamofire

Alamofire坚持使用该闭包,该闭包保留了一个FeedViewController实例(作为self )。 但是, Alamofire不属于FeedViewController ,因此没有周期。

的确,当请求运行时,由于完成回调阻止了此操作,因此无法取消分配FeedViewController ,但这可能是预期的行为,并且绝对没有所有权周期。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM