Я даю Контент или Адрес памяти, Цель C - PullRequest
0 голосов
/ 06 сентября 2011

У меня есть два разных объекта NSArray, скажем, -

NSArray* a and NSArray* b

Массив b используется для хранения текстового содержимого из файла CSV.

Теперь. если я сделаю операцию, подобную следующей:

a = b;

Копирую ли я содержимое b в a или ставлю точку в b? В первом случае изменения, внесенные в массив a, не будут отражены в массиве b. С другой стороны, в последнем случае они будут.

Спасибо

Ответы [ 4 ]

4 голосов
/ 06 сентября 2011

Просто адрес памяти (ссылка).

Если вы пришли из разработки на 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.
3 голосов
/ 06 сентября 2011

Просто адрес.

Если вам нужна копия, вам нужно сделать что-то вроде:

a = [b copy];
2 голосов
/ 06 сентября 2011

Оба a и b являются «указателями» на адрес памяти.Когда вы присваиваете значению b значение, они просто указывают на один и тот же адрес памяти.

Для получения дополнительной информации об указателях:

http://www.cocoadev.com/index.pl?HowToUsePointers

1 голос
/ 06 сентября 2011

Просто адрес памяти.Существуют явные методы для создания копии этого массива.Однако простое назначение, как указано выше, не приведет к копированию.

В терминах C оба указателя указывают на один и тот же адрес памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...