writeToFile не работает на iphone, но работает на симуляторе - PullRequest
1 голос
/ 19 января 2010
NSString *myfile = [[NSBundle] mainBundle] pathForResource:@"fileName" ofType:@"plist"];    
NSMutableArray *mydata= [[NSMutableArray alloc] initWithContentsOfFile:myfile];

/* code to modify mydata */

[mydata writeToFile:myfile atomically:YES]

В случае симулятора «fileName.plist» изменен, но в случае iphone файл устройства остается неизменным. Там также нет исключений.

Ожидается ли, что вышеприведенный код будет хорошо работать как на iphone, так и на симуляторе?

Также в отладчике при наведении курсора на «mydata» я вижу разные значения в случае симулятора и устройства. В случае симулятора я вижу, например, «5 объектов», но в случае реального устройства он показывает '{(int)[$VAR count]}'. Может ли это быть связано с тем, что файл не записывается?

1 Ответ

5 голосов
/ 19 января 2010

Вы не можете записывать в файлы в каталоге ресурсов пакета. Кроме того, вы этого не захотите, потому что любые изменения будут перезаписаны при обновлении приложения. Каталог документов сохраняется в разных версиях, и (я полагаю) он резервируется через itunes.

Вот фрагмент, который проверяет каталог документов на наличие списка. если файл не существует, он копирует список из ресурсов в каталог документов.

BOOL success;
NSFileManager* fileManager = [NSFileManager defaultManager]; 
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:@"score.plist"];
success = [fileManager fileExistsAtPath:writableDBPath];
if (success) return success;
// The writable database does not exist, so copy the default to the appropriate location.
NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"score.plist"]];
success = [fileManager copyItemAtPath:defaultDBPath toPath:writableDBPath error:&error]; 
return success;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...