Я считаю, что проблема заключается во вложенности словаря. dictionaryWithDictionary_()
не делает ничего похожего на глубокую копию; все, что он делает, это создает новый NSDictionary
и копирует указатели для значений (он сам копирует ключи, поскольку это характер NSDictionary
).
Это означает, что, хотя у вас есть новый верхний уровень, который вы можете использовать для перечисления, внутренние словари и массивы являются точно такими же объектами, как и в оригинале.
Ваш последний цикл:
for PreferredNetwork in copy['Sets'][Set]['Network']['Interface'][enX][key]['PreferredNetworks']:
перечисляет один из тех внутренних массивов, которые вы затем пытаетесь изменить с помощью оператора del
:
del pl['Sets'][Set]['Network']['Interface'][enX][key]['PreferredNetworks'][index]
Это не было скопировано; это тот же объект массива, который вы используете в for
, что вызывает исключение. Вы можете проверить это, передав два выражения в id()
.
Вам придется либо сделать полную копию исходного словаря, либо (возможно, лучше) сделать копию последнего уровня, прежде чем перечислять его.