string.length 键路径绑定在 Sonoma 上的 nib 解码期间崩溃

string.length keypath binding crashes during nib decode on Sonoma

提问人:Marek H 提问时间:11/8/2023 最后编辑:Marek H 更新时间:11/9/2023 访问量:19

问:

从 macOS 14.0 中获得的崩溃报告很少。深入挖掘后,我发现问题与带有 和 的键路径绑定() 有关。我在故事板中绑定并在代码中设置内容。内容是一个简单的包装器。NSDisplayPatternValueBindingNSObjectControllerNSTextViewNSTextViewNSObjectControllerNSObjectControllerString

当我使用带有“点”(text.length)的键路径时,会出现问题。如果我在从笔尖取消存档期间为已知的系统定义的文本替换设置字符串值(“On my way!”),应用程序将崩溃并显示以下错误消息。但是,如果该值不在文本替换字典中,则它不会崩溃。同样,对于简单的非点键路径,它不会崩溃。如果我将模型对象更改为NSString

这是macOS Sonoma错误还是我以不该使用的方式使用绑定?

错误消息(异常断点):

(lldb) po $x0
Cannot remove an observer <NSKeyValueObservance 0x6000031d0030> for the key path "length" from <Swift.__StringStorage 0x600002a7fa80> because it is not registered as an observer.
(null)

(lldb) po $x0
Cannot update for observer <NSObjectController 0x600000e78500> for the key path "text.length" from <KVOTextViewIssue.DymmyObject 0x600003f713a0>, most likely because the value for the key "text" has changed without an appropriate KVO notification being sent. Check the KVO-compliance of the KVOTextViewIssue.DymmyObject class.
(null)


(addresses are mixed, not the problem of having different nsobjectcontroller)
Failed to set (contentViewController) user defined inspected property on (NSWindow): Cannot update for observer <NSObjectController 0x6000027f6620> for the key path "text.length" from <KVOTextViewIssue.DymmyObject 0x6000016be100>, most likely because the value for the key "text" has changed without an appropriate KVO notification being sent. Check the KVO-compliance of the KVOTextViewIssue.DymmyObject class.

最小可重现示例:

final class DymmyObject : NSObject {
    @objc dynamic var text : String = "On my way!" //CRASHES
    //@objc dynamic var text : NSString = "On my way!" //DOES NOT CRASH
    //@objc dynamic var text : String = "Hello" //DOES NOT CRASH
}

class ViewController: NSViewController {

    @IBOutlet var textView: NSTextView!
    @IBOutlet var objectController: NSObjectController! {
        didSet {
            representedObject = dummy
        }
    }
    var dummy : DymmyObject = DymmyObject()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        self.textView.insertText("123", replacementRange: NSMakeRange(0, 0))
    }
}

深入挖掘 - 注意到崩溃时的背景线程是拼写检查器

enter image description here enter image description here enter image description here enter image description here

macOS 键值观察 Cocoa 绑定 nstextview

评论


答:

0赞 Marek H 11/8/2023 #1

将最低 macOS 部署目标从 10.13 提高到 10.14 可以解决 Sonoma 上的崩溃/问题。