对NSArray中对象的澄清

时间:2013-11-28 05:44:20

标签: ios objective-c arrays nsarray nsobject

如果这是一个菜鸟问题,我提前道歉。我只想弄清楚数组中对象之间的关系如何与实际对象相关。例如:

 UILabel *labelOne = //init stuff

 [self.view addSubview: labelOne];

 [labelArray addObject: labelOne];

现在,如果我像这样更改数组内对象的属性:

 [[labelArray objectAtIndex:0] setText:@"NEW STRING"];

我是否更新了数组内部的内容,还是更新了我的初始UILabel,因此反映了视图的变化?是否存在结果可能不同的情况? (即释放初始UILabel,对象仍在数组中,等等)

7 个答案:

答案 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"];

这是输出..

enter image description here

你可以看到,而不是文字“Dilip”,显示的文字是“Hi Dilip” labelArray仅存储labelOne的引用。因此,如果您更改labelArray中的任何内容,则会影响labelOne。