Macos NSTextView未解除锁定';d直到移动鼠标(清除撤消堆栈?)
我有一个NSTextView,我在窗口的内容视图中以编程方式创建它。在某些情况下,我需要以编程方式终止编辑并销毁NSTextView。当我这样做时(通过将first responder设置为nil,从SuperView中移除并释放指针),NSTextView上的dealloc不会被调用-直到我将鼠标移到窗口内容视图之外。这就好像窗口正在缓存对NSTextView的引用,并且只有在它确定我不再与窗口交互时才释放它。这不会是一个问题,除非这样会弄乱相关textContainer的撤消分组 有点晦涩——但如果有人知道这一点,我很想听听你的意见Macos NSTextView未解除锁定';d直到移动鼠标(清除撤消堆栈?),macos,cocoa,nstextview,Macos,Cocoa,Nstextview,我有一个NSTextView,我在窗口的内容视图中以编程方式创建它。在某些情况下,我需要以编程方式终止编辑并销毁NSTextView。当我这样做时(通过将first responder设置为nil,从SuperView中移除并释放指针),NSTextView上的dealloc不会被调用-直到我将鼠标移到窗口内容视图之外。这就好像窗口正在缓存对NSTextView的引用,并且只有在它确定我不再与窗口交互时才释放它。这不会是一个问题,除非这样会弄乱相关textContainer的撤消分组 有点晦涩—
谢谢我仍然不知道为什么NSTextView解除分配会被推迟,但事实证明,这是一个骗局。我的撤销堆栈被破坏的原因是因为我在textDidChange回调中破坏了我的NSTextView(尽管使用了retain/AUTORELASE来延迟实际的解除锁定) 如果我从textDidChange中通过performSelector:withObject:afterDelay调用destroyTextView:code来延迟我的destroyTextView:code,那么一切都很好(使用undo堆栈)
有道理,现在我已经找到了原因……不是吗?你可以使用仪器来找出是什么保留了视图。只要在启用僵尸的情况下将其覆盖,然后等待崩溃。这可能会帮你找到问题所在。好主意就这么做了,我的NSTextView最后一件事就是NSAutomaticFocusRing——不管是什么。不管怎样-给了我一个开始寻找的地方。Thanksry
setFocusRingType:NSFocusRingTypeNone
,并再次检查文本视图是否实际放弃了first responder状态(makeFirstResponder:nil
应返回YES
),因为只有first responder应该有一个焦点环。