Как копирование объектов работает в цели c - PullRequest
0 голосов
/ 29 марта 2011

Я немного запутался в том, как копирование объектов работает в Objective C. Вот что я знаю: когда вы копируете объект, вы получаете в память отдельный объект, который содержит все те же элементы из объекта, который вы только что скопировалии увеличивает счетчик хранения для каждого элемента.Кроме того, копирование каждого элемента объекта массива из оригинала в новое место означало просто копирование ссылки из одного элемента массива в другой.Итак, старое и новое указывают на один и тот же элемент.

Посмотрите на приведенный ниже код: почему при удалении объекта он влияет только на один объект, а при изменении элемента - как наоригинал и копия объекта?Разве удаление не затрагивает оба объекта?

NSMutableArray *dataArray = [NSMutableArray arrayWithObjects:
                            [NSMutableString stringWithString:@"one"],
                            [NSMutableString stringWithString:@"two"],
                            [NSMutableString stringWithString:@"three"], nil];
NSMutableArray *dataArray2;
NSMutableString *mStr;

NSLog(@"1-dataArray: ");
for( NSString *elem in dataArray)
    NSLog(@"   %@", elem);

dataArray2 = [dataArray mutableCopy];
[dataArray2 removeObjectAtIndex:0];

NSLog(@"2-dataArray2: ");
for( NSString *elem in dataArray2)
    NSLog(@"   %@", elem);

mStr =[dataArray objectAtIndex:1];
[mStr appendString:@"ONE"];



NSLog(@"3-dataArray: ");
for( NSString *elem in dataArray)
    NSLog(@"   %@", elem);


NSLog(@"4-dataArray2: ");
for( NSString *elem in dataArray2)
    NSLog(@"   %@", elem);

[dataArray2 release];

1 Ответ

1 голос
/ 29 марта 2011

mutableCopy выполняет «мелкую копию» содержимого NSArray.например.это копирование указателей (и, вероятно, их сохранение) из исходного массива.Это не копирование данных, на которые указывают указатели.

Если бы мы делали это явно, это, по сути, делало бы:

-(NSMutableArray*)mutableCopy
{
    NSMutableArray *newArray = [[NSMutableArray alloc] init];
    for (id elem in originalArray)
        [newArray addObject: elem];
    return newArray;
}

Хотя, по-видимому, он делает это более эффективно, используя свой доступ квнутренние структуры данных.

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