2010-05-09 112 views
2

我有一個應用程序通過模擬CMD-C複製命令並讀取粘貼板來讀取文本 - 不幸的是這是實現我所需的唯一方法。偶爾,因爲這是在開發中,偶爾我會做一些錯誤的事情(我認爲它與複製命令無關)並且應用程序崩潰。偶爾,這會對系統範圍的粘貼板造成影響 - 如果我嘗試複製,剪切或粘貼,任何正在運行的其他應用程序都會崩潰。崩潰OS X粘貼板

是否有強大的方法來處理這個問題 - 在退出之前,我應該使用NSPasteboard進行操作?任何關於可能發生的事情的信息都會被讚賞。

爲了完整起見,這裏是訪問紙板代碼的唯一片段:

從剪貼板閱讀:

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

最初清除剪貼板(我跑這一次,在發射):

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

PS我忘了提及這個複製命令運行在一個循環,在不同的線程 - 可能很重要。雖然我一直小心不要在沒有首先檢查循環停止的情況下訪問主線程上的粘貼板。

更新 - 約我在做什麼了幾個問題...

  • 你現在可以上傳崩潰報告

它的工作 - 不幸的是,崩潰是不規則的。 但讓我清楚 - 這是一個我仍在開發的應用程序,有時我會引入一個錯誤。當這導致崩潰時,系統範圍的粘貼板會變得混亂。它看起來並不像我應用程序中的粘貼板訪問引起崩潰,而是在後臺循環處於與PB交互的微妙階段時退出。 更新 - 重新報告崩潰 - 這對你們有多重要?我仍在開發,但可以嘗試運行它幾次,而不是在調試器中,直到出現故障。不幸的是,我現在修復了所有未完成的錯誤,並沒有發生任何崩潰。這強烈地向我暗示,問題不在於PBoard代碼本身 - 我更多地尋找一些保護措施,以便在出現崩潰的情況下,它不會降低整個系統的性能。所有這些重新啓動都變得煩人。

  • 你能否解釋一下爲什麼你需要效仿Cmd的-C做你需要什麼?

我正在從外部應用程序上的聊天框中拖動文本。該聊天框的目的是禁止我使用輔助功能界面或任何其他方式。

  • 爲什麼要在啓動時清除剪貼板的內容?

我檢查新文本的粘貼板文本。這是確保我不處理從其他應用程序複製的文本的快速方法。

  • 你爲什麼在一個線程上運行代碼?

該循環不斷地發佈事件以模擬用戶輸入,包括切換到聊天窗口以及複製選定的文本。如果這是在主線程上完成的,我的應用UI將會掛起。我使用用戶界面來顯示正在發生的事情。

  • 請表明主線程上運行,並檢查該循環並訪問紙板

後臺線程將數據傳遞到主線程使用NSNotifications的代碼:

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

您可以顯示崩潰報告以及崩潰位置的代碼嗎? – 2010-05-09 08:04:14

+0

這只是一個EXC_BAD_ACCESS錯誤 - 我不認爲應用程序崩潰與「卡住」粘貼板有關。事實上,我認爲全系統的紙板崩潰是我的應用以醜陋的方式退出的結果。 – 2010-05-09 08:18:35

+0

該問題極有可能是線程問題。這聽起來像你正在做一些非常時髦的東西。你能詳細說明爲什麼你需要模擬Cmd-C來做你需要的嗎?請張貼崩潰日誌,我們需要查看堆棧跟蹤以查看崩潰發生的位置。 – 2010-05-09 08:51:20

回答

1

一些想法:

  • 這是非常不可能的任何線程問題在一個應用程序將帶來其他應用程序。由於這看起來是您的主要問題,因此問題出現在您放在粘貼板上的數據或數據描述中的可能性更大。當他們嘗試使用粘貼板上的數據時,應用程序因某種原因崩潰。
  • 您使用的代碼僅適用於10.5或更低版本。在10.6中使用紙板的方式有幾個主要的變化。如果你運行在10.6以下,使用10.5方法可能會是你的問題。
  • 10.6的一個主要變化是依賴於UTI準確地描述紙板上的數據。如果UTI不正確或者出現亂碼,那麼任何試圖根據數據使用數據的應用程序都可能會崩潰。
  • 如果您使用的是10.6,請確保使用Pasteboard Programming Guide作爲參考,而不是較早的Cocoa粘貼板編程主題。