gpt4 book ai didi

objective-c - 导致 OS X 粘贴板崩溃

转载 作者:行者123 更新时间:2023-12-03 16:44:50 25 4
gpt4 key购买 nike

我有一个应用程序,它通过模拟 CMD-C 复制命令和读取粘贴板来读取文本 - 不幸的是,这是实现我需要的唯一方法。有时,由于这是正在开发中,我偶尔会做一些错误的事情(我不认为这与复制命令有关)并且应用程序崩溃。有时,这会对系统范围的粘贴板产生链式 react - 如果我尝试复制、剪切或粘贴,任何其他正在运行的应用程序都会崩溃。

有没有一种可靠的方法来处理这个问题 - 在退出之前我应该​​用 NSPasteboard 做一些事情?任何有关可能发生的情况的信息都会受到赞赏。

为了完整起见,以下是访问粘贴板的唯一代码片段:

从粘贴板读取:

NSString *pBoardText = [[NSPasteboard generalPasteboard]stringForType:NSStringPboardType];

最初清除粘贴板(我只在启动时运行一次):

[[NSPasteboard generalPasteboard] declareTypes: [NSArray arrayWithObject:NSStringPboardType] owner: self];
[[NSPasteboard generalPasteboard] setString: @"" forType: NSStringPboardType];

PS 我忘了提及这个复制命令在不同线程中循环运行 - 可能很重要。尽管我一直很小心,在没有首先检查循环是否停止的情况下不要访问主线程上的粘贴板。

更新 - 关于我正在做什么的一些问题...

  • 您可以发布崩溃报告吗

现在正在处理它 - 不幸的是崩溃是不规则的。让我澄清一下 - 这是我仍在开发的应用程序,有时我会引入一个错误。当这导致崩溃时,系统范围的粘贴板有时会变得困惑。不过,我的应用程序中的粘贴板访问看起来并没有导致崩溃,而是在后台循环处于与 PB 交互的微妙阶段时退出。更新 - 关于崩溃报告 - 这对你们来说有多重要?我仍在开发中,但可以尝试在调试器中运行几次,直到出现问题。不幸的是,我暂时修复了所有 Unresolved 错误,并且没有遇到任何崩溃。这强烈地向我表明问题不在于 PBoard 代码本身 - 我更多的是寻找一些保护措施,这样如果发生崩溃,它不会导致我的整个系统崩溃。所有这些重新启动都变得烦人。

  • 您能否详细说明为什么需要模拟 Cmd-C 来完成您需要的操作?

我正在从外部应用程序的聊天框中抓取文本。聊天框的构建是为了禁止我使用辅助功能界面或任何其他方式。

  • 为什么要在启动时清除剪贴板的内容?

我检查粘贴板文本中是否有新文本。这是确保我不会处理从其他应用程序复制的文本的快速方法。

  • 为什么要在线程上运行代码?

循环不断发布事件来模拟用户输入,包括切换到聊天窗口和复制所选文本。如果这是在主线程上完成的,我的应用程序 UI 将挂起。我使用 UI 来显示正在发生的事情的概述。

  • 请显示在主线程上运行并检查循环并访问粘贴板的代码

后台线程使用 NSNotifications 将数据传递到主线程:

[self performSelectorOnMainThread:@selector(postNote:) withObject:d waitUntilDone:NO];

最佳答案

一些想法:

  • 一个应用程序中的任何线程问题不太可能导致其他应用程序崩溃。。由于这似乎是您的主要问题,因此问题似乎更可能出在您放在粘贴板上的数据或数据的描述。当应用程序尝试使用粘贴板上的数据时,由于某种原因崩溃。
  • 您使用的代码仅适用于 10.5 或更早版本。 10.6 中粘贴板的使用方式有几个重大变化。如果您在 10.6 下运行,则使用 10.5 方法可能会出现问题。
  • 10.6 的一项重大变化是依赖 UTI 来准确描述粘贴板上的数据。如果 UTI 不正确或出现乱码,则任何尝试基于数据来自其他数据的假设来使用该数据的应用程序都可能会崩溃。
  • 如果您使用的是 10.6,请确保使用 Pasteboard Programming Guide作为您的引用,而不是旧的 Cocoa 粘贴板编程主题。

关于objective-c - 导致 OS X 粘贴板崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2796997/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com