[英]Why is this a retain cycle?
我对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
,但这可能是预期的行为,并且绝对没有所有权周期。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.