【发布时间】:2012-10-06 08:39:02
【问题描述】:
我将NSFileWrapper 用于我的包裹文件。有时,当我请求包内文件的数据时,我得到nil。
这是我查询包内文件数据的方式:
- (NSData*) dataOfFile(NSString*)filename {
NSFileWrapper *fileWrapper = [self.documentFileWrapper.fileWrappers objectForKey:filename];
return fileWrapper.regularFileContents; // This returns nil sometimes. Why?
}
此方法最终开始为某些文件(不是全部)返回 nil。遗憾的是,我未能始终如一地重现该问题。
如果有帮助,这就是我打开包裹的方式:
- (BOOL) readFromFileWrapper:(NSFileWrapper *)fileWrapper ofType:(NSString *)typeName error:(NSError *__autoreleasing *)outError {
self.documentFileWrapper = fileWrapper;
return YES;
}
这是我更新包内文件数据的方式:
- (void) updateFile:(NSString*)filename withData:(NSData*)data {
SBFileWrapper *fileWrapper = [self.documentFileWrapper.fileWrappers objectForKey:filename];
if (fileWrapper) {
[self.documentFileWrapper removeFileWrapper:fileWrapper];
}
NSFileWrapper *fileWrapper = [[SBFileWrapper alloc] initRegularFileWithContents:data ];
fileWrapper.preferredFilename = filename;
[self.documentFileWrapper addFileWrapper:fileWrapper];
}
这是我保存包的方式:
- (NSFileWrapper*) fileWrapperOfType:(NSString *)typeName error:(NSError *__autoreleasing *)outError {
return self.documentFileWrapper;
}
为什么会发生这种情况?有什么办法可以预防吗?
regularFileContents 的文档似乎谈到了这个问题:
如果用户在您修改文件后,此方法可能会返回 nil 调用 readFromURL:options:error: 或 initWithURL:options:error: 但是 在 NSFileWrapper 读取文件内容之前。使用 NSFileWrapperReadingImmediate 读取选项以减少可能性 那个问题。
但我不明白为了防止这种情况必须在上面的代码中进行哪些更改。
失败的实验
如果regularFileContents 返回 nil,我尝试保存文档,但之后仍返回 nil。像这样:
- (NSData*) dataOfFile(NSString*)filename {
NSFileWrapper *fileWrapper = [self.documentFileWrapper.fileWrappers objectForKey:filename];
NSData *data = fileWrapper.regularFileContents;
if (!data) {
[self saveDocument:nil];
fileWrapper = [self.documentFileWrapper.fileWrappers objectForKey:filename];
data = fileWrapper.regularFileContents;
}
return data;
}
【问题讨论】:
-
这是一个疯狂的猜测,但我想知道聚光灯是否在您保存后修改文件属性(例如重新索引文件或其他内容)?我有点好奇你为什么在失败后保存;为什么不重新打开它呢?只是猜测尝试给你一些想法。
-
猜测,但我认为您的对象已被释放。也许分配器出了点问题。你试过分析吗?小心 alloc 和 init(以及 self. + autorelease 和 release)。
标签: macos cocoa nsdocument nsfilewrapper