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

时间:2019-03-04 10:10:36

标签: ios swift automatic-ref-counting

我对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 :(得分:3)

从技术上讲,没有周期。

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

Alamofire保留该闭包,该闭包保留一个FeedViewController实例(作为self)。但是,Alamofire不是FeedViewController的所有者,因此没有循环。

的确,在请求运行时,FeedViewController无法释放,因为完成回调阻止了该行为,但这可能是预期的行为,并且绝对没有所有权周期。