私のパッケージ文書にNSFileWrapper
を使用しています。場合によっては、パッケージ内のファイルのデータを要求すると、私はnil
となります。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
のドキュメントは、この問題について話して表示されます。
This method may return nil if the user modifies the file after you call readFromURL:options:error: or initWithURL:options:error: but before NSFileWrapper has read the contents of the file. Use the NSFileWrapperReadingImmediate reading option to reduce the likelihood of that problem.
しかし、私はこのような状況を防ぐために、上記のコードで変更する必要があるかを理解していません。
失敗した実験
私はregularFileContents
リターンゼロならば、文書を保存しようとしたが、それはまだ、その後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;
}
これはクレイジーな推測ですが、保存した後にスポットライトがファイルの属性を変更しているかどうかは疑問です。私はちょっと不思議で、失敗した後にあなたが貯蓄している理由です。代わりにそれを開くのはなぜですか?ちょうどあなたにいくつかのアイデアを試してみることを推測する。 – Dad
野生の推測ですが、私はあなたのオブジェクトが解放されると思います。多分何かがallocで間違っているかもしれません。あなたは分析を試みましたか? allocとinit(そしてself + autoreleaseとrelease)には注意してください。 – Roger