当NSMenuItem的目标/选择器设置为对象时,为EXC_BAD_ACCESS

时间:2018-08-07 08:58:27

标签: swift macos nsmenu nsmenuitem

我正在使用此类抽象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错误。

但是,当我注释掉设置目标或操作的行时,问题就会消失了(当然,菜单将无法单击)。

那我该如何解决呢?谢谢。

编辑:

我应该说我已经尝试过这些事情:

  1. 使用#selector(x.doAction)而不是#selector(MenuItem.doAction)
  2. 使用#selector(x.doAction(sender:))

此外,输出窗口中没有任何内容。这就是为什么我在这里寻求帮助。更糟糕的是,它涉及到EXC_BAD_ACCESS,因为内存应该由系统管理,所以我很难理解。

1 个答案:

答案 0 :(得分:0)

所以问题在于,在getMenu函数完成后,我传递给静态items函数的数组内部的getMenu被释放了(很快之后是{{1 }}。

我通过强烈引用该数组来解决它。