Как я храню строку как массив в списке свойств Какао?

3 ответа

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

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

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

2
ответ дан 3 September 2019 в 01:28
поделиться

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

[NSArray arrayWithObject:str];

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

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

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

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

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

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

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

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

0
ответ дан 3 September 2019 в 01:28
поделиться

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

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

0
ответ дан 3 September 2019 в 01:28
поделиться