Как мне сохранить строку в виде массива в списке свойств Какао? - PullRequest
1 голос
/ 10 июня 2009

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

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

[словарь setObject: (id) anObject forKey: (id) 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];
}

Ответы [ 3 ]

2 голосов
/ 10 июня 2009

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

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

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

0 голосов
/ 11 июня 2009

Правильный способ сохранить 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:], просто используйте строковый литерал. Если вы хотите использовать другую строку в массиве, вы можете передать ее как дополнительный параметр, получить ее из другого метода и т. Д.

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

0 голосов
/ 10 июня 2009

Вы конвертируете строку в массив из одного элемента с

[NSArray arrayWithObject:str];

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

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

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

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

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

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

...