Как мне сохранить строку в виде массива в списке свойств Cocoa?
-
13-09-2019 - |
Вопрос
Я пытаюсь сохранить две строки.Одна строка должна быть сохранена как тип 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:]
, просто используйте строковый литерал.Если вы хотите использовать другое значение в качестве строки в массиве, вы можете либо передать его в качестве дополнительного параметра, либо взять его из другого метода и т.д.
Этот метод по-прежнему хрупок в том смысле, что он хранит только одну строку в массиве, соответствующую данному ключу — кроме того, имя метода было бы лучше, если бы оно более точно указывало на то, что он делает.Кроме того, если для каждого ключа когда-либо будет только одно строковое значение, вы могли бы рассмотреть возможность пересмотра списка, чтобы полностью исключить массивы, поскольку это просто занимает место и усложняет код.