gpt4 book ai didi

ios - Swift : Simultaneous accesses to 0x10959c600, 但修改需要对 Structs 的独占访问

转载 作者:搜寻专家 更新时间:2023-10-31 22:53:55 29 4
gpt4 key购买 nike

我想了解为什么使用结构会导致此问题,而使用类则不会。我在将元素附加到数组并让观察者加载表时遇到了问题。以下是代码:

Order.swift - 订购的元素

struct Order {
var menuItems: [MenuItem]
init(menuItems: [MenuItem] = []) {
self.menuItems = menuItems
}
}

MenuController.swift - 包含订单和共享实例

struct MenuController {  
static var shared: MenuController = MenuController()
static let orderNotification = Notification.Name("MenuController.orderUpdated")

var order = Order() {
didSet {
NotificationCenter.default.post(name: MenuController.orderNotification,
object: nil)
}
}

MenuItemViewController.swift - 订购屏幕

@IBAction func orderButtonTapped(_ sender: UIButton) {
MenuController.shared.order.menuItems.append(menuItem)
}

OrderTableViewController.swift - 项目订购屏幕

override func viewDidLoad() {
super.viewDidLoad()

NotificationCenter.default.addObserver(tableView,
selector: #selector(UITableView.reloadData),
name: MenuController.orderNotification, object: nil)
}
...
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return MenuController.shared.order.menuItems.count //Simultaneous access error thrown here
}

现在,我犯了一个设计错误,其中 MenuController 应该是一个而不是一个结构,因为我们将在整个应用程序中共享 MenuController 实例,因此它应该是一个引用类型。使用类解决了同时访问问题。

我感到困惑的是:当观察者尝试加载 tableView 时,为什么值类型(结构)MenuController 会导致此同时访问问题。

希望有人能解释一下。 TIA!

最佳答案

它与“对内存的独占访问”有关,并在此处进行了很好的解释:
Simultaneous accesses to 0x1c0a7f0f8, but modification requires exclusive access error on Xcode 9 beta 4

简短版本:var 不能同时是“可读”和“可写”。当 set 操作开始时,var 是“可写的”,如果 get 操作发生(“可读”)而 var 仍然是“可写的”,它将触发一个异常。

didSet 上,var 是“可写的”。如果 didSet 中的操作导致调用堆栈中某处指向正在读取的 var,它将触发异常。

即使没有 didSet,如果您有一个设置 var 然后发布通知的变异函数,通知的观察者将尝试读取它,也会触发相同的异常。

关于ios - Swift : Simultaneous accesses to 0x10959c600, 但修改需要对 Structs 的独占访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53220080/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com