myArray - NSArray объектов NSDictionary. Будет ли [myArray mutableCopy] содержать оригинальные объекты NSDictionary или копии NSMutableDictionary? Есть ли простой способ сделать неизменяемый граф объектов полностью изменчивым?Изменяет ли mutableCopy содержащиеся объекты?
ответ
Если вы не возражаете против количества времени, необходимого для крупного объекта, и вы на самом деле хотите глубоких копий объектов, вы можете сериализовать граф объекта и затем десериализовать его. Самый простой способ сделать это (при условии, что все ваши объекты являются объектами Foundation Collection) - использовать класс NSPropertyListSerialization. Сериализуйте свой корневой объект на данные, затем десериализуйте в свой изменяемый массив корневого уровня, используя опцию NSPropertyListMutableContainersAndLeaves
. Ваш результирующий изменчивый массив на уровне корня будет глубокой копией, и все контейнеры будут изменчивыми. Важно помнить, что это действительно будет глубокой копией, поэтому, если вы что-то измените в другом контейнере, это изменение не будет отражено в исходных объектах.
Вот краткий пример кода:
// Assumes the root-level object is an array, adjust as necessary
- (NSMutableArray*)deepMutableCopyOfArray:(NSArray*)array error:(NSError**)outError
{
NSError* error = nil;
NSData* serializedData = [NSPropertyListSerialization dataWithPropertyList:array format:NSPropertyListBinaryFormat_v1_0 options:0 error:&error];
if(!serializedData) {
if(outError) *outError = error;
return nil;
}
NSMutableArray* mutableCopy = [[NSPropertyListSerialization propertyListWithData:serializedData options:NSPropertyListMutableContainersAndLeaves format:NULL error:&error] retain];
if(!mutableCopy) {
if(outError) *outError = error;
return nil;
}
return mutableCopy;
}
Копии в какао обычно мелкие. Это означает, что это влияет только на самый верхний объект, в данном случае на массив. Вы получите изменчивый массив неизменяемых словарей. Нет ни одного лайнера, чтобы сделать всю вещь изменчивой, как вы просите.
Единственный способ сделать это - перебрать исходный массив, создать изменяемые копии каждого объекта и заменить неизменяемые объекты в изменяемом массиве их изменчивыми братьями. Уол, слово mutable потеряло всякий смысл.
NSArray *mutableArray = [originalArray mutableCopy];
for (NSDictionary *dictionary in originalArray)
{
NSInteger index = [originalArray indexOfObject:dictionary];
NSMutableDictionary *mutableDictionary = [dictionary mutableCopy];
[mutableArray replaceObjectAtIndex:index withObject:mutableDictionary];
}
Должно быть ясно, что вы можете работать еще дальше в графике с вложенными циклами. В зависимости от размера массива вам может потребоваться резервный пул для хранения памяти.
Я думаю, что если вы используете блок итератора, было бы более эффективным, так как вы бы прошли индекс и не должны искать его для каждого объекта , –
О, я! Перечисление на основе блоков. Доступно на устройствах iOS 4+ рядом с вами сейчас! –
- 1. Сравнить объекты, содержащиеся на карте
- 2. SQLAlchemy: изменяет ли ящик объекты моего объекта?
- 3. mutableCopy в скор
- 4. Python multiprocessing.Queue изменяет объекты
- 5. Возможно ли переходить на объекты, содержащиеся в другом классе?
- 6. Как найти размер объекта (включая объекты, содержащиеся)
- 7. очистка dojox/mobile/Объекты, содержащиеся в Аккордеоне
- 8. copy/mutablecopy в массиве
- 9. Динамически создавать все объекты, содержащиеся в файле
- 10. Является ли mutableCopy состоянием или поведением объекта?
- 11. mutableCopy утечка памяти
- 12. Mutablecopy mem утечка?
- 13. Флажок изменяет родительский tr, а входы, содержащиеся в
- 14. NSDictionary: Сравнение после MutableCopy
- 15. NSDictionary mutableCopy повышает exc_bad_access
- 16. addObjectsFromArray против mutableCopy
- 17. mutableCopy of NSInteger
- 18. Почему mutableCopy здесь?
- 19. Изменяет ли объекты-члены класса в деструкторе результат неопределенного поведения?
- 20. ReSharper изменяет INTELLISENSE поведение, когда initilizing объекты
- 21. Как разделять объекты, содержащиеся в одной 3D-сетке
- 22. random_shuffle изменяет перетасованные объекты (C++ 11)
- 23. объекты запроса, содержащиеся в составном объекте в doctrine2
- 24. Как разбирать все объекты json, содержащиеся в строке?
- 25. Подсчитайте содержащиеся объекты с помощью cakephp 3.x
- 26. C++: Как вставить объекты, содержащиеся в векторе, в набор?
- 27. Присваивание значения в угловых областях и объекты, содержащиеся в нем
- 28. GEODjango: выберите все объекты, содержащиеся в запросе POST, заданный полигон
- 29. Замените .sln на MSBuild и заверните содержащиеся проекты в объекты
- 30. NSString mutableCopy делает утечку памяти?
К сожалению, это не работает, когда входной массив содержит NSNull – Vytis