给定两个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。
答案 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;
}