我对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()
}
}
}
答案 0 :(得分:3)
从技术上讲,没有周期。
首先,NetworkHelper
从不拥有任何东西,它只是将闭包传递给Alamofire
。
Alamofire
保留该闭包,该闭包保留一个FeedViewController
实例(作为self
)。但是,Alamofire
不是FeedViewController
的所有者,因此没有循环。
的确,在请求运行时,FeedViewController
无法释放,因为完成回调阻止了该行为,但这可能是预期的行为,并且绝对没有所有权周期。