Ошибка MAC OS X NSMutableDictionary writeToFile

мой код такой. А значение ret всегда НЕТ, думаю путь записи не разрешен. Но где я могу хранить информацию о MAC OS X для своего приложения? Можете ли вы помочь мне найти правильный путь для хранения настроек моего приложения? Большое спасибо~ :)

NSString* writePath = [[[NSBundle mainBundle] resourcePath]
                        stringByAppendingPathComponent:@"Brain.plist"];

NSLog(@"%@",writePath);
NSMutableDictionary* dictForRet = [[NSMutableDictionary alloc]init];
NSNumber* applicationNumber = [[NSNumber alloc]initWithInt:0];
NSMutableDictionary* root = [[NSMutableDictionary alloc]init];
NSArray* propertyArray = [[NSArray alloc]initWithObjects:kPropertyArrayApplicationPath,kPropertyArrayApplicationCS, nil];
NSMutableDictionary* brain = [[NSMutableDictionary alloc]init];
[root setObject:propertyArray forKey:kPropertyArrayName];
[dictForRet setObject:applicationNumber forKey:kPropertyKeyApplicationNumber];
[dictForRet setObject:root forKey:kPropertyArrayDictName];
[dictForRet setObject:brain forKey:kPropertyDictBrainName];
NSLog(@"%@",dictForRet);
ret = [dictForRet writeToFile:writePath atomically:YES];
NSLog(@"%d",ret);

person RetVal    schedule 20.04.2012    source источник


Ответы (2)


Путь к ресурсу относится к каталогу Resources/ в вашем комплекте приложений. Вы не хотите писать по этому пути, что обычно не разрешено (особенно в случае изолированного приложения).

Чтобы получить пути к стандартным расположениям, таким как каталог поддержки приложений, используйте NSSearchPathForDirectoriesInDomains.

Вероятно, вы ищете что-то вроде:

NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES);

Это вернет (массив размера 1) URL-адрес поддержки приложения, автоматически выбрав правильный путь, если ваше приложение изолировано.

person Joris Kluivers    schedule 20.04.2012
comment
Извините, приложение не изолировано, работает на LION. И как мой класс может получить полный путь к каталогу поддержки моего приложения? например, /Users/xxxx/Library/Application Support/myApplication/ - person RetVal; 20.04.2012
comment
Приложения Lion могут быть (и должны быть, если они выпущены через магазин приложений) в песочнице. Однако, если вы используете NSSearchPathForDirectoriesInDomains, он вернет правильный каталог для обоих типов приложений, изолированных или нет (это преимущество использования системных функций). Просто добавьте имя вашего приложения к пути, возвращаемому этой функцией. - person Joris Kluivers; 20.04.2012
comment
Я уже пытаюсь запустить этот код, а обратный путь — /Users/xxxx/Library/Application Support. И я только начинаю учиться программировать на os x, поэтому я не знаком с системными функциями, можете ли вы дать некоторые ключевые слова, которые могут помочь мне найти документы или простой пример кода. Еще раз спасибо. - person RetVal; 20.04.2012
comment
Это все, что вам нужно правильно. В сочетании с кодом из вашего вступительного поста: [path stringByAppendingPathComponent:@"MyApp"] должен получиться путь к вашему приложению. Возможно, вам придется создать этот каталог с помощью -[NSFileManager createDirectoryAtPath:withIntermediateDirectories:attributes:error:], поскольку он не существует по умолчанию. После этого просто добавьте Brains.plist к этому пути, и вы получите доступное для записи место для вашего файла plist. - person Joris Kluivers; 20.04.2012
comment
Я думаю, что так лучше.NSString *appName = [[[NSBundle mainBundle] infoDictionary] objectForKey: (NSString *)kCFBundleNameKey]; if (nil == appName) appName = [[NSProcessInfo processInfo] processName]; И я нахожу проблему в том, что каталог не существует по умолчанию. И если я должен хранить всю необходимую мне информацию в этом каталоге? В iOS файлы настроек сохраняются в комплекте приложений? Большое спасибо. - person RetVal; 20.04.2012
comment
Да, это хороший способ найти имя приложения. Вероятно, вам следует создать каталог вручную. И то же самое на iOS, вы не можете писать в набор приложений. Альтернативой для iOS может быть сохранение ваших данных в местоположениях, возвращаемых при передаче NSDocumentDirectory. - person Joris Kluivers; 20.04.2012
comment
@RetVal: даже если вы не поместили приложение в песочницу, все еще есть допустимые случаи, когда оно не будет доступно для записи. Вы не можете предположить, что он будет доступен для записи. Лучше даже не пытаться; просто напишите где-нибудь, что будет доступно для записи. - person Peter Hosey; 20.04.2012

Вы не можете писать в пакет текущего приложения.

Вместо этого вы можете поместить его в свою песочницу, в ~/Library/Application Support/YOUR_APP/ или в указанное пользователем место.

person justin    schedule 20.04.2012
comment
Но как я могу изменить настройку файлов plist по умолчанию? Должен ли я переписать все файлы настроек по пути ~/Library/Application Support/YOUR_APP/? И как я могу получить местоположение по коду какао. PS: приложение не изолировано. - person RetVal; 20.04.2012
comment
вы используете связанный файл в качестве ссылки и сохраняете его копию в другом месте (например, ~/Library/Application Support/YOUR_APP/). в некоторых случаях вы можете захотеть сохранить некоторую информацию в NSUserDefaults. - person justin; 20.04.2012
comment
Папка поддержки приложений не является песочницей. В изолированном приложении каталог контейнера песочницы находится в другом месте (в библиотеке/контейнерах, IIRC), а внутри него находится каталог поддержки приложений. - person Peter Hosey; 20.04.2012