我正在实现一个简单的主-从应用程序,其中主viewController
管理一个表视图,该视图显示对 REST 服务的调用结果。详细信息viewController
管理一个视图,在该视图中显示有关主控形状中所选项目的详细信息。常见方案。
我正在尝试应用MVVM
模式。在主viewController
中,我以这种方式创建和初始化其viewModel
:
lazy private var viewModel: ListViewModel = {
return ListViewModel()
}()
override func viewDidLoad() {
super.viewDidLoad()
initViewModel()
}
private func initViewModel() {
viewModel.onModelChange = { [weak self] () in
DispatchQueue.main.async {
self?.tableView.reloadData()
}
}
viewModel.fetchData()
}
我的问题是:在提供给viewModel
的闭包中,self
应该weak
还是unowned
?我找到了一个实现类似于我的场景的示例,该场景将其设置为weak
,另一个将其设置为unowned
,所以我不完全清楚。
[无主自我]。这会告诉您的模型不要对ViewController
进行强引用
苹果文件明确指出:
"就像弱引用一样,无主引用不会保持强引用 保留它引用的实例。然而,与弱引用不同, 假定无主引用始终具有值"。
在您的情况下,总会有ViewController
.所以无主引用的好处是它nonoptional
.每次使用时都无需解包
Unowned
在100% 确定对象不会被解除分配时使用。
weak
,您需要处理其引用计数问题。
viewModel.onModelChange = { [weak self] () in
guard let strongSelf = self else { return }
strongSelf.tableView.reloadData()
}
我通常这样做。然后,您持有self
的强引用,以避免在块运行期间分配它。
unowned
和weak
之间的区别在于weak
被声明为可选,而unowned
则不是。如果你知道自我不会被nil
使用unowned
,如果你不知道:使用weak