У меня есть приложение, которое читает в тексте, эмулируя команды копирования CMD-C и считывая картотеку - к сожалению, это единственный способ добиться того, что мне нужно. Иногда, поскольку это находится в разработке, время от времени я делаю что-то неправильно (я не думаю, что это связано с командой копирования), и приложение выходит из строя. Время от времени это влияет на общесистемный картон - любое другое запущенное приложение сбой, если я попытаюсь выполнить копирование, вырезать или вставить.Сбой OS X Pasteboard
Есть ли надежный способ справиться с этим - что-то, что я должен делать с NSPasteboard перед выходом? Любая информация о том, что может произойти, оценивается.
Для полноты, вот только фрагменты кода, которые имеют доступ к картону:
Чтения из картона:
NSString *pBoardText = [[NSPasteboard generalPasteboard]stringForType:NSStringPboardType];
Первоначально очищая картон (я бег это только один раз, при запуске):
[[NSPasteboard generalPasteboard] declareTypes: [NSArray arrayWithObject:NSStringPboardType] owner: self];
[[NSPasteboard generalPasteboard] setString: @"" forType: NSStringPboardType];
PS Я забыл упомянуть, что эта команда копирования работает в цикле, в другом потоке - может быть важна. Хотя я старался не получать доступ к картону в основном потоке, не проверяя сначала, что цикл остановлен.
Update - несколько вопросов о том, что я делаю ...
- Вы можете разместить отчет об ошибке
Работая над этим прямо сейчас - к сожалению, падает скачками. Позвольте мне быть ясным, хотя - это приложение, которое я все еще разрабатываю, и иногда я вводил ошибку. Когда это приводит к сбою, общесистемный картон перепутался с SOMETIMES. Это не похоже на то, что доступ к картотеке в моем приложении вызывает подозрение, однако, что он выходит, когда фоновый цикл находится на деликатной стадии взаимодействия с PB. Обновление - Повторите отчет о сбое - насколько это важно для вас, ребята? Я все еще разрабатываю, но могу попытаться запустить его несколько раз не в отладчике, пока что-то не сломается. К сожалению, я исправил все выдающиеся ошибки до сих пор и не получаю никаких сбоев. Это наводит на мысль, что проблема заключается не в самом коде PBoard - я больше ищу некоторые меры предосторожности, поэтому, если это катастрофа, она не разрушает мою всю систему. Все эти перезагрузки раздражают.
- Можете ли вы уточнить, почему вам нужно подражать Cmd-C, чтобы делать то, что вам нужно?
Я извлекаю текст из окна чата во внешнем приложении. Ящик чата построен, чтобы запретить мне использовать интерфейс Accessibility или любые другие средства.
- Почему вы очищаете содержимое буфера обмена при запуске?
Я просматриваю текст картонного текста для нового текста. Это был быстрый способ убедиться, что я не обрабатываю текст, скопированный из какого-либо другого приложения.
- Почему вы используете код в потоке?
Цикл постоянно публикует события для имитации ввода пользователя, включая переход в окно чата и копирование выделенного текста. Если это будет сделано в основном потоке, мой пользовательский интерфейс приложения будет просто зависать. Я использую пользовательский интерфейс для отображения обзора того, что происходит.
- пожалуйста показать код, который выполняется в главном потоке и проверяет петлю и получает доступ к монтажному столу
фоновый поток передает данные в основной поток с помощью NSNotifications:
[self performSelectorOnMainThread:@selector(postNote:) withObject:d waitUntilDone:NO];
Можете ли вы показать отчет о сбое и код, где находится авария? – 2010-05-09 08:04:14
Это просто ошибка EXC_BAD_ACCESS. Я не думаю, что авария приложения связана с «застрявшей» картой. На самом деле, я думаю, что общесистемный картонный крах является РЕЗУЛЬТАТОМ моего приложения, выходящим уродливо. –
Проблема, вероятно, будет проблемой с потоками. Похоже, вы делаете довольно забавные вещи. Можете ли вы объяснить, почему вам нужно подражать Cmd-C, чтобы делать то, что вам нужно? Пожалуйста, разместите журнал сбоев, нам нужно увидеть трассировку стека, чтобы увидеть, где произошел сбой. –