Как мне сохранить строку в виде массива в списке свойств Cocoa?

StackOverflow https://stackoverflow.com/questions/972605

Вопрос

Я пытаюсь сохранить две строки.Одна строка должна быть сохранена как тип ARRAY в списке, а вторая строка должна быть сохранена как строка в массиве.

Я могу использовать код:

[набор объектов словаря:(идентификатор) разветвленный ключ anObject:(идентификатор)aKey>]

но это не сохраняет его правильно.Я могу привести одну из строк в виде массива, но это все равно работает неправильно.

Каков правильный метод сохранения массива в pList?

Вот как выглядит мой pList:

<dict>
<key>Test One</key>
<array>
    <string>A13#</string>
</array>
<key>Another Test</key>
<array>
    <string>1111111111</string>
</array>
<key>Test Three</key>
<array>
    <string>2222222222</string>
</array>
<key>Final Test</key>
<array>
    <string>3333333333</string>
</array>
</dict>

вот метод, который я использую, чтобы попытаться

-(void)writeToFile:(NSString *)s1{
    NSBundle *bundle = [NSBundle mainBundle];
NSString *plistPath = [bundle pathForResource:@"saved" ofType:@"plist"];

NSMutableDictionary *dictionary = [[[NSDictionary alloc] initWithContentsOfFile:plistPath] mutableCopy];
NSString *tempString = [NSString stringWithFormat:@"1234567"];
[dictionary setObject:tempString forKey:s1];

[dictionary writeToFile:plistPath atomically:YES];
}
Это было полезно?

Решение

Вы не можете привести или иным образом преобразовать строку в массив;это отдельные, отчетливые объекты.Это то же самое, как если бы в реальной жизни вы попытались превратить свою собаку в универсал, но этого не происходит.

Вместо этого поместите свою собаку внутрь универсала (или поместите свои строки внутри массива).Вы можете создать массив с помощью [NSArray arrayWithObjects:@"string1", @"string2", nil];.Вставьте это в свой словарь для данного ключа вместе с вашей окончательной строкой для другого ключа, сохраните ее, и у вас будет список с массивом из одной или нескольких строк.

Кроме того, в вашем примере кода в вашем словаре происходит утечка памяти.Почитайте об управлении памятью в Objective-C, вы столкнетесь с множеством сбоев и проблем с производительностью, пока не разберетесь в этом хорошенько.

Другие советы

Вы можете преобразовать строку в массив из одного элемента с помощью

[NSArray arrayWithObject:str];

Итак, если вы хотите, чтобы ваш список содержал записи в виде массивов строк, и вам нужна только одна строка в качестве элемента, тогда вы делаете что-то вроде:

[dictionary setObject:[NSArray arrayWithObject:tempString] forKey:s1];

На самом деле я не понимаю, зачем вам это нужно, если только вы не хотите разрешить несколько строк для каждого ключа в какой-то другой момент.

Кроме того, как упоминал Марк, вы пропускаете исходный (неизменяемый) раздел, который вы создаете.Ознакомьтесь с правилами управления памятью по адресу http://developer.apple.com/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html.

Кроме того, вы никогда не должны писать внутри пакета вашего приложения.Во-первых, ваше приложение может находиться на томе, защищенном от записи, или у текущего пользователя может не быть разрешений на его изменение.С другой стороны, затем файл стал бы общим для всех пользователей.И, в-третьих, это нарушило бы подписание кода.Вместо этого запишите файл либо в папку Настроек, либо в папку Поддержки приложения.

И, наконец, если предполагается, что это какие-то пользовательские настройки, то вам следует использовать систему настроек, которая позволяет настраивать значения по умолчанию и сохраняет настройки в папке preferences для вас.Видишь http://developer.apple.com/documentation/Cocoa/Conceptual/UserDefaults/UserDefaults.html для получения дополнительной информации.

Правильный способ сохранить NSArray ( Скопление ) (сам по себе) в файл plist выглядит следующим образом:

NSArray* anArray = ...;
[anArray writeToFile:@"/path/to/file.plist" atomically:YES];

Однако вы не можете сохранить NSString в виде массива.Учитывая предоставленный вами XML-список, если вы хотите добавить записи с тем же форматом, вы можете использовать этот гораздо более простой код:

- (void) writeToFile:(NSString *)string {
  NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"saved" ofType:@"plist"];
  NSMutableDictionary *dictionary = [NSMutableDictionary dictionaryWithContentsOfFile:plistPath];
  [dictionary setObject:[NSArray arrayWithObject:@"1234567"] forKey:string];
  [dictionary writeToFile:plistPath atomically:YES];
}

Это также позволяет избежать утечки памяти в вашем коде, где получатель -mutableCopy экранируется с количеством сохранений, равным 1.(Это не проблема в GC, но это все еще плохая практика.) Вам не нужно использовать +[NSString stringWithFormat:], просто используйте строковый литерал.Если вы хотите использовать другое значение в качестве строки в массиве, вы можете либо передать его в качестве дополнительного параметра, либо взять его из другого метода и т.д.

Этот метод по-прежнему хрупок в том смысле, что он хранит только одну строку в массиве, соответствующую данному ключу — кроме того, имя метода было бы лучше, если бы оно более точно указывало на то, что он делает.Кроме того, если для каждого ключа когда-либо будет только одно строковое значение, вы могли бы рассмотреть возможность пересмотра списка, чтобы полностью исключить массивы, поскольку это просто занимает место и усложняет код.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top