在ViewController之间传递NSArray。是指针还是副本?

时间:2012-02-10 20:07:31

标签: objective-c ios memory-management uiviewcontroller nsarray

给定两个UIViewControllers A和B.A位于UINavigationController之上。 B具有init函数initWithArray。在A中制作了B并使用了initWithArray。然后将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 个答案:

答案 0 :(得分:2)

在您的代码中,arrayInB指向与指向arrayInA的arrayFromA相同的内存地址。我建议更改你的代码,以便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 :(得分:1)

由于您只创建了一个数组(该代码未显示,但您的注释引用了“假设所有init和所有内容都已完成”),只存在一个实例,并且所有三个引用都指向该实例。

答案 2 :(得分:1)

根据您提供的信息,arrayInA应具有与arrayInB相同的地址值,因此它们将指向同一个对象。这是因为实例变量使用'assign'setter语义。

您可以随时检查以确保打印指针地址:

- (id) initWithArray:(NSArray*)arrayFromA {
    ...
    if (self) {
      arrayInB = arrayFromA;
      NSLog(@"arrayInA:%x arrayInB:%x", arrayInA, arrayInB);
      ...
    }
    return self;
}