Передача NSArray между ViewController. Это указатель или копия? - PullRequest
1 голос
/ 11 февраля 2012

Имеется два UIViewController A и B. A располагается поверх UINavigationController. B имеет функцию init initWithArray. B был сделан и initWithArray в A. Затем B был помещен в NavigationController, чтобы сидеть на вершине A.

В A это массив, который был передан в

NSArray *arrayInA; //(assuming all init and everything was done)

Изготовление B

B *b = [[B alloc]initWithArray: arrayInA];
[self.navigationController pushViewController: B animation: YES];

В B initWithArray работает примерно так

if (self){
    arrayInB = arrayFromA;
}

arrayInB - это просто частная собственность в B

NSArray *arrayInB;

Вопрос в том, какие из этих объектов разные? arrayInA / arrayFromA / arrayInB

Редактировать: я работаю с ARC.

Ответы [ 3 ]

2 голосов
/ 11 февраля 2012

В вашем коде arrayInB указывает на тот же адрес памяти, что и arrayFromA, который указывает на arrayInA. Я бы предложил изменить ваш код так, чтобы arrayInB сохраняла ссылку на полученный массив.

if (self){
   arrayInB = [arrayFromA retain];
}

или

@property (nonatomic,retain) NSArray * arrayInB;

if (self){
   self.arrayInB = arrayFromA;
}

Если вы хотите, чтобы arrayInB был собственным массивом, указывающим на те же объекты, что и arrayFromA, то вам следует сделать это.

if(self){
   self.arrayInB = [NSArray arrayWithArray:arrayFromA];
}
1 голос
/ 11 февраля 2012

Учитывая предоставленную вами информацию, arrayInA должна иметь то же значение адреса, что и arrayInB, поэтому они будут указывать на один и тот же объект. Это связано с тем, что переменные экземпляра используют семантику присваивания 'assign'.

Вы всегда можете проверить это, напечатав адреса указателей:

- (id) initWithArray:(NSArray*)arrayFromA {
    ...
    if (self) {
      arrayInB = arrayFromA;
      NSLog(@"arrayInA:%x arrayInB:%x", arrayInA, arrayInB);
      ...
    }
    return self;
}
1 голос
/ 11 февраля 2012

Поскольку вы создали только один массив (этот код не показан, но на него ссылается ваш комментарий «при условии, что все init и все сделано»), существует только один экземпляр, и все три ссылки указывают на этот экземпляр.

...