код ниже работает, но я хочу убедиться, что он правильный .Я нервничаю из-за наличия в моем словаре пустого массива, который я создаю из plist, поскольку обычно кажется, что если вы не скажете, initWithCapacity:1
, то вы часто получаете ошибки памяти, когда начинаете пытаться добавлять элементы.
По крайней мере, таков мой опыт работы с NSMutableDictionary.Однако это первый раз, когда я пытаюсь реализовать вложенные объекты данных, поэтому, возможно, причина того, что этот код работает, заключается в том, что вложенный массив автоматически инициализируется, когда он импортируется как часть своего родительского словаря?
Любой ивсе комментарии приветствуются.Спасибо.
Во-первых, вот как выглядит plist, который я использую для создания своего словаря:
![someData.plist](https://i.stack.imgur.com/RGLdH.png)
Далее, вот мой код, где яиспользуя plist для создания словаря, затем добавляем элемент в dataArray
</p>
<pre><code>// Create a pointer to a dictionary
NSMutableDictionary *dictionary;
// Read "SomeData.plist" from application bundle
NSString *path = [[NSBundle mainBundle] bundlePath];
NSString *finalPath = [path stringByAppendingPathComponent:@"SomeData.plist"];
dictionary = [NSMutableDictionary dictionaryWithContentsOfFile:finalPath];
// Now let's see if we can successfully add an item to the end of this empty nested array. How 'bout the number 23
NSNumber *yetAnotherNumber = [NSNumber numberWithInt:23];
[[dictionary objectForKey:@"dataArray"] addObject:yetAnotherNumber];
// Dump the contents of the dictionary to the console
NSLog(@"%@", dictionary);
Хорошо, хорошо, просто, хорошо.Когда я регистрирую содержимое словаря, это показывает, что «23» было добавлено в качестве значения массива к dataArray
.Так что код работает.Но опять же, я хочу подтвердить, что мне здесь не «везет», так как мой код просто работает, хотя я не инициализирую этот вложенный массив должным образом.Если это так, то я мог бы столкнуться с непредвиденными ошибками позже.
Итак, для подведения итогов, dataArray
- это пустой массив внутри .plist, поэтому мне нужно как-то его инициализировать (используя, например, initWithCapacity:
или что-то еще) прежде чем я смогу правильно заполнить это, или способ, которым я здесь кодирую, просто отлично?
Еще раз спасибо.
РЕДАКТИРОВАТЬ
Привет всем.Я продолжал исследовать это, чтобы найти удовлетворительный ответ.Я думаю, что, возможно, наткнулся на что-то через по этой ссылке на глубокое копирование .В его предыдущих постах о глубоком копировании был представлен некоторый код, который по сути выполняет то, что я искал выше: создать изменяемую копию словаря или массива из plist, который также имеет изменяемые подструктуры.
Однако, как упомянуто в ссылке выше, похоже, что эти методы были излишними, из-за метода CFPropertyListCreateDeepCopy
, который можно вызывать с помощью вызова, такого как
testData = CFPropertyListCreateDeepCopy(kCFAllocatorDefault, [NSDictionary dictionaryWithContentsOfFile:path], kCFPropertyListMutableContainersAndLeaves);
Итак, мой вопрос, могу ли я правильно использовать CFPropertyListCreateDeepCopy
, как показано выше, для достижения того, о чем я здесь спрашиваю?Другими словами, могу ли я использовать этот метод для импорта моего словаря из списка с полностью изменяемыми вложенными объектами данных?
Как я уже упоминал в одном из комментариев, я знаю, что могу создать вложенный изменяемый словарь вручную, но для сложных данных это просто не практично, и кажется маловероятным, что встроенные методы для импорта изменяемого списка не существуют.Итак, исходя из вышесказанного, похоже, что я, возможно, нашел решение, но я все еще слишком новичок в этом, чтобы сказать наверняка.Пожалуйста, сообщите.
(Примечание: я бы просто протестировал код, но, как мы выяснили, текущий SDK содержит ошибки с точки зрения возможности редактирования неизменяемых вложенных словарей, в отличие от задокументированного поведения.как и раньше, меня интересует не только то, работает ли это, но и правильно ли это )
Заранее спасибо.