我对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()
}
}
}
从技术上讲,没有循环。
首先,NetworkHelper
从来没有拥有任何东西,它只是通过封闭到Alamofire
。
Alamofire
持有封闭,保留FeedViewController
实例(作为self
)。但是,Alamofire
不归FeedViewController
所有,因此没有循环。
确实,当请求正在运行时,FeedViewController
无法解除分配,因为完成回调阻止了这一点,但这可能是预期的行为,并且肯定没有所有权周期。