![]() |
1
3
在与苹果工程师在AppKit中合作后,找到了一个解决方案。 在我们的应用程序中,由于各种原因,我们通过这种方法“刷新”事件队列:
Mac OS X系统在启动时向应用程序发送“显示”事件。我们的 脸红 函数在启动时被调用,它有效地将该事件从队列中删除,但Mac OS X的核心进程部分有自己的内部队列,可以跟踪显示和隐藏以及其他类型的事件类型,这样它就不会发送重复的消息。(我会调查是否真的需要冲洗)
问题是当
这个特殊问题的解决方案是在清除事件时更具选择性。对于我的新实现,我不清楚将由核心流程发送的事件。
由于“显示”事件在启动时未被清除,请立即显示和隐藏工作! 特别感谢苹果的KF! |
![]() |
2
0
这种技术不适合发表评论,但我可能建议近距离接触DTrace。我在上面的注释中建议将NSWindow子类化,并将NSLog语句放在-orderOut:等方法中。然而,使用DTrace可能会更有效——尽管正如你所看到的,知道你将要观察的对象的地址仍然很有用——好处是你不会在代码中乱放一堆NSLog语句。 最简单的脚本可能是:
并且将通过执行以下操作使用应用程序的进程id进行调用:
在这种特殊情况下,arg0将包含窗口的地址。不幸的是,从DTrace中获取窗口的标题甚至NSString的内容显然不是一件小事,但这可能是值得的。我有个问题 here 和 here 看看是否有人知道做这两件事中的任何一件。(如果你能得到窗口的标题,你可以设置一个从窗口地址到字符串的映射。) 将探针连接到您认为可能涉及的任何和所有方法、函数等都很容易,因此您可以尝试“跟踪事件”来解决此问题。 因此,最终,我建议继续添加DTrace探测,直到有东西提供所需的提示来解决这个问题。 |
![]() |
Martin sku · 在目标C中打印时间 2 年前 |
![]() |
Vinod prajapat · 如何更新数组的最后一个元素? 3 年前 |
![]() |
subin272 · 修复iOS中的多个按钮单击事件? 6 年前 |
![]() |
James Chan · 如何使用锁定/解锁? 6 年前 |
![]() |
Josh F. · NSBundle mainBundle返回零 6 年前 |