0

XML ファイルをフォーマットするドキュメント ベースのアプリケーションがあります。

ドキュメントの書き込みと読み取りは、私の NSDocument サブクラスで行われます

- (BOOL)writeToURL:(NSURL *)absoluteURL ofType:(NSString *)typeName error:(NSError **)outError
- (BOOL)readFromURL:(NSURL *)absoluteURL ofType:(NSString *)typeName error:(NSError **)outError

しかし、ファイルが無効な XML である場合、私のアプリは単純にクラッシュします。

だから私は実装しました:

- (BOOL)application:(NSApplication *)theApplication openFile:(NSString *)filename  
{  
  if(safe){open new document using .....makeDocumentWithContentsOfURL:......}  
   else{present alert}  
}

しかし、これには明らかな副作用がたくさんあります。他のいくつかのメソッドをオーバーライドする必要があります。

-(BOOL)writeSafelyToURL:(NSURL *)absoluteURL ofType:(NSString *)typeName     forSaveOperation:(NSSaveOperationType)saveOperation error:(NSError **)outError  
{  
    return [self writeToURL:absoluteURL ofType:typeName error:outError];  
    //return YES;  
}  

ここにビーチボール カーソルが表示され、最終的にアプリケーションが応答しなくなります。

ドキュメントを開く前に検証するより良い方法はありますか?

4

3 に答える 3

2

-readFromURL:ofType:error:悪いXMLでクラッシュしないように実装する必要があります。これは、検証を行う必要があるルーチンです。コードのどの部分がクラッシュの原因であり、どのような種類のクラッシュが発生していますか?

のビーチボールに関しては、-writeSafelyToURL:ofType:forSaveOperation:error:おそらく無限ループを作成しています。-writeToURL:ofType:error:を呼び出す可能性があります-writeSafelyToURL:....。いずれにせよ、これはそれをオーバーロードする非常に奇妙な方法です。ここで何を達成しようとしていますか?-application:openFile:過負荷が最初の問題またはあなたが説明する過負荷にどのように関連しているかわかりません。

于 2009-08-18T14:10:00.133 に答える
1

application:openFile: メソッドでこれを呼び出すのが最善の策です。

[[NSDocumentController sharedDocumentController] openDocumentWithContentsOfURL:[NSURL fileURLWithPath:filename] display:YES error:&error];

それを使用しても問題はありませんでした (ドキュメント アーキテクチャも初めてです)。その行の前に検証を行うだけで、すべてが機能するはずです。

もう 1 つの便利な点: 異なるタイプの NSDocument の読み込み/保存メソッドのいずれかをオーバーライドする場合、それらの中で保存/読み込みを行わない場合は、必ず最後にそれぞれのスーパー バージョンを呼び出してください。したがって、たとえばreadFromData:ofType:error:、あるタイプのデータを別のタイプにすることができ、要求されたタイプを処理しない場合、それぞれの最後にreadFromFileWrapper:ofType:error:呼び出す限り、両方が自動的に機能します。[super ...]

于 2010-07-21T22:15:18.653 に答える