Просто адрес памяти (ссылка).
Если вы пришли из разработки на C, вы должны знать, что звезда *
рядом с типом NSArray означает, что это тип указателя. Это то же самое в Objective-C.
(Если вы не знаете C и это о указателях, просто забудьте об этом, поскольку каждый тип объекта в ObjC является указателем, он совершенно прозрачен для конечного кодера)
Если вы хотите создать независимую копию из b
, чтобы изменение a
не изменило b, тогда использует метод copy
. (Если вы это сделаете, не забудьте выпустить его позже, так как любой alloc/retain/copy
должен быть сбалансирован с помощью вызова release/autorelease
в конце)
В любом случае, обратите внимание, что и NSArray
являются неизменяемыми с помощью конструкции , что означает, что в классе NSArray
нет метода для изменения его содержимого. Так что для вашего точного примера указание на тот же NSArray
(без создания глубокой копии) на самом деле не проблема, так как вы не можете изменить NSArray
.
Это начинает становиться проблемой, только если вы используете NSMutableArray
, у которого есть методы для изменения их содержимого.
При работе с изменяемыми классами, такими как NSMutableArray
, вы должны использовать mutableCopy
, чтобы иметь изменяемую копию (вместо copy
, которая возвращает неизменный объект)
Позвольте мне проиллюстрировать это на следующем примере:
NSMutableArray* a = [NSMutableArray arrayWithObjects:@"a",@"b",@"c"];
NSMutableArray* b = a; // points to the same object as a
NSArray* c = [[a copy] autorelease]; // immutable copy
NSMutableArray* d = [[a mutableCopy] autorelease]; // mutable copy, independant with a
// Now if you modify a...
[a addObject:@"d"];
// ...then b is also modified (it is the same object)
// but c and d aren't.
[d addObject:@"independant"];
// this does only modify d, but neither a, b or c.
// [c addObject:@"illegal"]; // <-- can't do this, addObject is a method of NSMutableArray, non-existing on NSArray.