Копия мелкая, она копирует только указатель. Если массив содержит изменяемый объект и этот объект изменен, изменение будет отображаться в скопированном массиве.
NSMutableString *s = [@"test1" mutableCopy];
NSArray *a1 = @[s];
NSArray *a2 = [a1 copy];
NSLog(@"\na1: %1$p, %[email protected]\na2: %2$p, %[email protected]", a1, a2);
[s appendString:@"2"];
NSLog(@"\na1: %1$p, %[email protected]\na2: %2$p, %[email protected]", a1, a2);
Выход:
a1: 0x10010fed0, (
test1
)
a2: 0x10010fed0, (
test1
)
a1: 0x10010fed0, (
test12
)
a2: 0x10010fed0, (
test12
)
Причина копия для защиты в том случае, когда массив копируемым является изменяемым массивом, так что любое изменение исходного массива не изменится скопированный массив , Разница заключается в изменении изменяемого массива и изменении объекта в изменяемом массиве. Обратите внимание, что еще одна причина заключается в том, что нельзя знать, что назначенный массив изменен или нет.
NSString *s1 = @"test1";
NSString *s2 = @"test2";
NSMutableArray *a1 = [@[s1] mutableCopy];
NSArray *a2 = [a1 copy];
NSLog(@"\na1: %1$p, %[email protected]\na2: %2$p, %[email protected]", a1, a2);
[a1 addObject:s2];
NSLog(@"\na1: %1$p, %[email protected]\na2: %2$p, %[email protected]", a1, a2);
Выход:
a1: 0x100200510, (
test1
)
a2: 0x100200650, (
test1
)
a1: 0x100200510, (
test1,
test2
)
a2: 0x100200650, (
test1
)
Обратите внимание, что копия на непреложный NSArray просто выполняет задание, так что ничего не стоит. Существует только копия, когда назначаемый массив является NSMutableArray.
NSString *s1 = @"test1";
NSString *s2 = @"test2";
NSArray *a1 = @[s1];
NSArray *a2 = [a1 copy];
NSLog(@"\na1: %1$p, %[email protected]\na2: %2$p, %[email protected]", a1, a2);
Выход:
a1: 0x100300140, (
test1
)
a2: 0x100300140, (
test1
)
FANTASTIC описание. БЛАГОДАРЯ! – SpaceDog