EXC_BAD_ACCESS 当 NSMenuItem 的 target/selector 设置为对象时
EXC_BAD_ACCESS when an NSMenuItem's target/selector is set to an object
我正在使用这个 class:
抽象 NSMenuItem
class MenuItem{
let title: String
let iconName: String
let action: Action
init(title: String, iconName: String, _ action: @escaping Action) {
self.title = title
self.iconName = iconName
self.action = action
}
@objc func doAction(sender: NSMenuItem){
action()
}
}
下面是构建菜单的静态函数:
static func getMenu(items: [MenuItem]) -> NSMenu{
let m = NSMenu()
for x in items{
let item = NSMenuItem()
item.title = x.title
item.target = x // If I remove this line or the line below, there won't be any crash
item.action = #selector(MenuItem.doAction)
item.image = x.iconName.toImage()
m.addItem(item)
}
return m
}
现在我的问题是,只要显示上下文菜单,程序就会崩溃并出现 EXC_BAD_ACCESS 错误。
但是,当我注释掉设置目标或操作的行时,问题就会消失(当然菜单将无法点击)。
那么我该如何解决这个问题呢?谢谢
编辑:
我应该声明我已经尝试过这些东西:
- 使用#selector(x.doAction) 而不是#selector(MenuItem.doAction)
- 使用#selector(x.doAction(发件人:))
此外,输出中没有任何内容window。这就是为什么我在这里寻求帮助。更糟糕的是,它涉及 EXC_BAD_ACCESS 鉴于内存应该由系统管理,我很难理解。
所以问题是我传递给静态 getMenu
函数的数组中的 items
在 getMenu 函数完成后被释放(紧随其后的是 popUpMenuWithEvent:forView
).
我通过对该数组的强引用解决了它。
我正在使用这个 class:
抽象 NSMenuItemclass MenuItem{
let title: String
let iconName: String
let action: Action
init(title: String, iconName: String, _ action: @escaping Action) {
self.title = title
self.iconName = iconName
self.action = action
}
@objc func doAction(sender: NSMenuItem){
action()
}
}
下面是构建菜单的静态函数:
static func getMenu(items: [MenuItem]) -> NSMenu{
let m = NSMenu()
for x in items{
let item = NSMenuItem()
item.title = x.title
item.target = x // If I remove this line or the line below, there won't be any crash
item.action = #selector(MenuItem.doAction)
item.image = x.iconName.toImage()
m.addItem(item)
}
return m
}
现在我的问题是,只要显示上下文菜单,程序就会崩溃并出现 EXC_BAD_ACCESS 错误。
但是,当我注释掉设置目标或操作的行时,问题就会消失(当然菜单将无法点击)。
那么我该如何解决这个问题呢?谢谢
编辑:
我应该声明我已经尝试过这些东西:
- 使用#selector(x.doAction) 而不是#selector(MenuItem.doAction)
- 使用#selector(x.doAction(发件人:))
此外,输出中没有任何内容window。这就是为什么我在这里寻求帮助。更糟糕的是,它涉及 EXC_BAD_ACCESS 鉴于内存应该由系统管理,我很难理解。
所以问题是我传递给静态 getMenu
函数的数组中的 items
在 getMenu 函数完成后被释放(紧随其后的是 popUpMenuWithEvent:forView
).
我通过对该数组的强引用解决了它。