2010-05-09 3 views
2

У меня есть приложение, которое читает в тексте, эмулируя команды копирования 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]; 
+0

Можете ли вы показать отчет о сбое и код, где находится авария? – 2010-05-09 08:04:14

+0

Это просто ошибка EXC_BAD_ACCESS. Я не думаю, что авария приложения связана с «застрявшей» картой. На самом деле, я думаю, что общесистемный картонный крах является РЕЗУЛЬТАТОМ моего приложения, выходящим уродливо. –

+0

Проблема, вероятно, будет проблемой с потоками. Похоже, вы делаете довольно забавные вещи. Можете ли вы объяснить, почему вам нужно подражать Cmd-C, чтобы делать то, что вам нужно? Пожалуйста, разместите журнал сбоев, нам нужно увидеть трассировку стека, чтобы увидеть, где произошел сбой. –

ответ

1

Некоторые мысли:

  • Очень маловероятно, чтобы любые проблемы с резьбой в одном приложении снимет другие приложения. Поскольку это, по-видимому, ваша основная проблема, кажется более вероятным, что проблема связана с данными, которые вы помещаете в картотеку или описанием данных. Попытка приложений по какой-то причине, когда они пытаются использовать данные на картоне.
  • Код, который вы используете, предназначен только для 10.5 или более ранних версий. Было несколько серьезных изменений в способе использования картона в 10.6. Если вы работаете под 10.6, использование методов 10.5 может быть вашей проблемой.
  • Одним из основных изменений в 10.6 является использование UTI для точного описания данных на картоне. Если UTI неверен или искажен, любое приложение, пытающееся использовать данные на основе предположения, что это какой-то другой из данных, может потерпеть крах.
  • Если вы используете 10.6, обязательно используйте Pasteboard Programming Guide в качестве вашей справки, а не более старые темы программирования для картона для какао.