如果这是一个菜鸟问题,我提前道歉。我只想弄清楚数组中对象之间的关系如何与实际对象相关。例如:
UILabel *labelOne = //init stuff
[self.view addSubview: labelOne];
[labelArray addObject: labelOne];
现在,如果我像这样更改数组内对象的属性:
[[labelArray objectAtIndex:0] setText:@"NEW STRING"];
我是否更新了数组内部的内容,还是更新了我的初始UILabel,因此反映了视图的变化?是否存在结果可能不同的情况? (即释放初始UILabel,对象仍在数组中,等等)
答案 0 :(得分:3)
数组存储对该对象的强引用,但不复制它。所以只有一个标签。因此,您展示的代码将更新标签的文本。
答案 1 :(得分:1)
它将更改屏幕上的UILabel,因为NSArray只保存对象的引用,它不会复制。因此,无论您将哪些标签放入数组中,都只是对已经创建的内容的引用。
答案 2 :(得分:1)
是的,它会更新您的初始UILabel
,因此会反映UIView
上的更改,因为UILabel
的引用存储在数组中。
答案 3 :(得分:1)
IT将更新您的初始UILabel,因为NSArray持有原始UILabel的引用而不是副本
答案 4 :(得分:0)
您的labelArray
将包含指向每个添加对象的指针。并为每个添加对象增加保留计数器。因此,[[labelArray objectAtIndex:0] setText:@"NEW STRING"];
也会更改labelOne.text
,因为您引用了一个UILabel
对象。
答案 5 :(得分:0)
UILabel *labelOne = //init stuff
[self.view addSubview: labelOne];
[labelArray addObject: labelOne];
[[labelArray objectAtIndex:0] setText:@"NEW STRING"];
您添加到labelArray的标签与初始labelOne是同一个对象。 但是如果你要避免这种行为,你可以使用copy方法将labelOne的副本添加到labelArray。
[labelArray addObject: [labelOne copy]];
这将在labelArray中为您提供labelOne对象的副本。更改标签文本后,此副本不会更改。 因此,从数组中获取labelOne后,标签将处于初始状态。
答案 6 :(得分:0)
是的,这将更改视图上显示的标签文本的值。看到这里我已经模拟了场景..
代码....
UILabel *labelOne = [[UILabel alloc] initWithFrame:CGRectMake(20, 30, 200, 20)];
labelOne.text = @"Dilip";
[self.view addSubview: labelOne];
NSMutableArray *labelArray =[[NSMutableArray alloc] init];
[labelArray addObject: labelOne];
[[labelArray objectAtIndex:0] setText:@"Hi Dilip"];
这是输出..
你可以看到,而不是文字“Dilip”,显示的文字是“Hi Dilip” labelArray仅存储labelOne的引用。因此,如果您更改labelArray中的任何内容,则会影响labelOne。