Глубокая копия и мелкая копия

Я прочитал ответ на разницу между глубокой копией и мелкой копией из сообщения, В чем разница между глубокой копией и мелкой копией?. Теперь я сомневаюсь, что когда мы сделали мелкую копию

 newArray = [NSmutableArray arrayWithArray:oldArray];

новый массив будет указывать на oldArray. (Как видно из рисунка). Теперь, когда я удаляю объект из newArray? Как из рисунка, он должен удалить один и тот же элемент из oldArray тоже!!! Кажется,

newArray = oldArray - мелкая копия, а newArray = [NSmutableArray arrayWithArray:oldArray]; - глубокая копия. Правильно?

Ответы

Ответ 1

newArary = oldArray не является копией вообще. Вы получаете два указателя, указывающих на тот же самый массив.

newArray = [NSMutableArray arrayWithArray:oldArray]; является мелкой копией. Вы получаете два разных массива, поэтому, если вы должны удалить или добавить элементы из одного массива, это не повлияет на другой массив. Однако элементы в двух массивах идентичны. Если первый элемент oldArray был NSMutableDictionary, и вы добавили к нему ключ, вы увидите это изменение и для первого элемента newArray (так как эти два объекта одинаковы).

Чтобы сделать глубокую копию, вам нужно будет создать новый массив, и каждый элемент нового массива будет представлять собой глубокую копию соответствующего элемента старого массива. (Да, это определение является рекурсивным).

Ответ 2

Прежде всего, NSArray не имеет функции глубокой копии. Однако вы можете сделать глубокую функцию копирования, выполнив следующие действия:

@interface NSArray(deepCopy)

-(NSArray *) deepCopy;

@end

@implementation

-(NSArray *) deepCopy
{
    NSMutableArray *ret = [NSMutableArray array];

    for (id val in self)
    {
        if ([val conformsToProtocol:@protocol(NSCopying)])
        { 
            [ret addObject:[val copy]];
        }
        else
        {
           [ret addObject:val];
        }
    }

    return ret;
}

@end 

Во-вторых, newArray = oldArray не копирует массив. Это просто означает, что newArray указывает на массив, который указывает oldArray.

В-третьих, +arrayWithArray: делает мелкую копию массива, то есть отдельные объекты НЕ копируются.

Ответ 3

Вы также можете вызвать [[NSArray alloc] initWithArray:arraytoBeCopied copyItems:YES];

Ответ 4

В Objective-C ключевое слово "Копировать" просто увеличьте "Удержание счета" объекта. Поэтому использование "Копировать" не будет выполнять копию.

Но когда мы делаем изменение в объекте, тогда Objective-C создаем копию исходного объекта в это время.

Пожалуйста, поправьте меня, если я ошибаюсь.

Спасибо