Хорошо, если вы пытаетесь сделать то, что я думаю, вы пытаетесь сделать: нет, это не сработает.
Я предполагаю, что вы хотите сохранить sharedDocument
для каждого уникального файла на запрошенном диске, независимо от любых других sharedDocuments
существующих. Но ваш код этого не сделает, потому что каждый раз, когда передается fileName, который отличается от последнего, переданного в fileName, ссылка на старый UIManagedDocument
теряется.
Представьте себе следующий (надуманный) сценарий:
UIManagedDocument *docA = [self sharedManagedDocumentForFile:@"fileA.txt"];
UIManagedDocument *docB = [self sharedManagedDocumentForFile:@"fileB.txt"];
UIManagedDocument *docA2 = [self sharedManagedDocumentForFile:@"fileA.txt"];
Вы ожидаете, что docA
и docA2
будут одинаковыми UIManageDocument
, но этого не произойдет, потому что средняя строка заставила вашу статическую переменную забыть исходный управляемый документ для file1.txt1
.
Я бы отказался от использования статической переменной. Есть много других способов сделать это. Простой способ - использовать NSMutableDictionary
для сопоставления имен файлов с UIManagedDocument
экземплярами. Примерно так:
+ (UIManagedDocument *)sharedManagedDocumentForFile:(NSString *)fileName
{
//assuming we have an instance variable: NSMutableDictionary *docDictionary
UIManagedDocument *doc = [docDictionary objectForKey:fileName];
if (!doc) {
NSURL *url = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
url = [url URLByAppendingPathComponent:fileName];
// url is "<Documents Directory>/<vacationName>"
doc = [[UIManagedDocument alloc] initWithFileURL:url];
[docDictionary setObject:doc forKey:fileName];
}
return doc;
}
Обновление
Поскольку sharedManagedDocumentForFile:
является методом класса, вы не можете хранить docDictionary
в качестве переменной экземпляра для своего класса, как вы заметили. Вместо этого вы можете объявить его в файле .m
перед реализацией вашего класса следующим образом:
static NSMutableDictionary *docDictionary = nil;
@implementation MyClass ...
Это фактически дает один экземпляр docDictionary
, который существует вне любых экземпляров вашего класса. Экземпляры ваших классов все еще могут получить к нему доступ.
Ключевое слово static
гарантирует, что эта переменная docDictionary
не будет доступна вне текущей единицы компиляции (то есть исходного файла). Для получения дополнительной информации о static и его различных значениях см. Такие вопросы, как Разница между static в C и static в C ++ ??