2013-11-28 59 views
1

如果這是一個noob問題,我提前致歉。我只想澄清數組內的對象與實際對象之間的關係。例如:對NSArray中對象的說明

UILabel *labelOne = //init stuff 

[self.view addSubview: labelOne]; 

[labelArray addObject: labelOne]; 

現在,如果我改變數組內的對象的屬性,像這樣:

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

我是隻更新什麼是數組內還是會同時更新我最初的UILabel和因此反映在視圖上的變化?有什麼情況下結果可能會有所不同? (即釋放對象仍在陣列中的初始UILabel等)

+0

好問題:) –

+0

它可能通過UILabel的屬性和使用KVO模式 – Tirth

+0

可能重複[NSArray複製對象?](http:// stackoverflow。COM /問題/ 1258735 /不-NSArray的複製對象) –

回答

3

該數組存儲對該對象的強引用,但不會將其複製。所以只有一個標籤。所以你展示的代碼將更新標籤的文本。

1

它將更改屏幕上的UILabel,因爲NSArray只保存對象的引用,它不會創建副本。因此,無論您將數組放入數組中的標籤都只是您已創建的參考。

1

是的,它會更新您的初始UILabel,因此反映在UIView上的更改作爲參考UILabel存儲在數組中。

0

您的labelArray將包含指向每個添加對象的指針。併爲每個添加對象增加保留計數器。因此[[labelArray objectAtIndex:0] setText:@"NEW STRING"];也會更改labelOne.text,因爲您引用了一個UILabel對象。

1

爲NSArray的持有原來的UILabel的參考,而不是有複印件

0
UILabel *labelOne = //init stuff 
[self.view addSubview: labelOne]; 
[labelArray addObject: labelOne]; 
[[labelArray objectAtIndex:0] setText:@"NEW STRING"]; 

您添加到labelArray的標籤是相同的對象初始labelOne IT將更新您最初的UILabel。 但是,如果您要避免此類行爲,可以使用複製方法將labelOne的副本添加到labelArray。

[labelArray addObject: [labelOne copy]]; 

這會給你一個labelOne對象的副本labelArray。更改標籤文本後,此副本不會更改。 因此,從數組中獲得labelOne後,標籤將處於初始狀態。

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

你可以看到文本,它不是「迪利普「顯示的文字是」Hi Dilip「。
labelArray只存儲labelOne的引用。所以如果你改變labelArray中的任何東西都會影響labelOne。