我有一个基于文档的应用程序,用于格式化 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;
}
这就是沙滩球光标出现的地方,最终应用程序变得无响应。
在打开文档之前是否有更好的方法来验证文档?
最佳答案
您应该实现 -readFromURL:ofType:error:
,这样它就不会因错误的 XML 而崩溃。这是您应该进行验证的例程。您的代码的哪一部分导致了崩溃,以及它是什么类型的崩溃?
关于 -writeSafelyToURL:ofType:forSaveOperation:error:
中的沙滩球,您可能正在创建一个无限循环。 -writeToURL:ofType:error:
可能会调用 -writeSafelyToURL:....
。无论如何,这是一种非常奇怪的重载方式。你想在这里实现什么目标?我不明白重载 -application:openFile:
与您的第一个问题或您描述的重载有何关系。
关于objective-c - 在 NSDocument 架构中打开文档之前进行验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1294056/