2014-01-24 256 views
-2

你能澄清我以下: 我對象 - 將對象添加到數組

NSMutableArray *_array;

...

_array = [[NSMutableArray alloc] initWithCapacity:20]; 

MyClassItem *item; 
item = [[MyClassItem alloc] init]; 

item.a = @"a"; 
item.b = @"b"; 
[_array addObject:item]; 

item.a = @"a1"; 
item.b = @"b1"; 
[_array addObject:item]; 

在這種情況下,我收到_array兩個相似的物體, 項目[0] == .A item [1] .a == @「a1」 但我認爲item [0] .a應該是@「a」...

我知道如果每次添加它之前都要初始化item排列,一切都會好的,

MyClassItem *item; 
item = [[MyClassItem alloc] init]; 

item.a = @"a"; 
item.b = @"b"; 
[_array addObject:item]; 

item = [[MyClassItem alloc] init];//If I add this line, everything is OK 

item.a = @"a1"; 
item.b = @"b1"; 
[_array addObject:item]; 

我想這樣 - 我有一個對象,我修改它的屬性,並添加到數組後,我再次修改它的屬性並將其添加到數組,但如果它只把指針指向它的對象,爲什麼我用相同對象的init修復它?

發生在第一次init期間分配的內存?

希望你明白我的挫折)

+0

指針,你需要了解指針。 http://www.techotopia.com/index.php/Pointers_and_Indirection_in_Objective-C – sbarow

+0

我真的不認爲這種初學者問題應該被降低。我們都從某個地方開始,問題本身沒有任何錯誤。對於幾乎所有的開發人員來說,他所要求的內容都很清晰,對某些人來說這很容易 - 這可能確實令人頭疼。 – avuthless

回答

0

您有一個對象,它由指針item引用。首先將item.a分配爲@"a",然後將其a屬性更改爲@"a1"。不過,這兩次都是同一個對象。要創建另一個MyClassItem,您必須再次編寫item = [[MyClassItem alloc] init]。這是創建對象的分配。

+0

很明顯,tx,但是第一次啓動時分配的內存會發生什麼? –

+0

@ S.ork:好問題。那麼,在你重新分配變量之前,對象需要被釋放,否則對象將被泄漏,你永遠無法釋放內存。如果你使用ARC(這似乎是大多數人現在所做的),ARC會爲你自動發佈一個版本。否則,你需要自己做。 – Chuck

1

在您更改了相同的對象尚屬首例。該數組包含兩個指向內存中相同位置的指針。知道如何指針工作回答你的問題。在第二個示例中,您將創建一個新對象(第一個對象由數組保留並且不會丟失),然後獲得正確的不同屬性。

0

這是因爲你對item的存儲位置,每當點更新item,對存儲位置更新的數據和item,而不是他們的價值你_array商店內存位置。

但是如果你分配新的內存,那麼在兩個不同的內存位置上有兩個item的副本,這就是爲什麼當你更新第二個內存位置時,第一個內存位置沒有改變。

0

爲了理解這個,你需要知道對象和指向對象的指針有什麼區別。

對象是實際的對象及其所有數據。指針是一個信息,在內存中存在對象,並允許您訪問該對象。更多檢查C中變量名稱前的含義*

在objc中,只能有指向對象的指針。所以在這種情況下,這是發生了什麼。

_array = [[NSMutableArray alloc] initWithCapacity:20]; 

MyClassItem *item; 
item = [[MyClassItem alloc] init]; //here object is created, pointer to it is stored in 'item' 

item.a = @"a"; //you manipulate that object 
item.b = @"b"; 
[_array addObject:item]; //here pointer to it is added to array. Object is not copied, array will contain a pointer pointing at initial item. So item and _array[0] is not two different objects - it's one object. 

item.a = @"a1"; //and you are modifying this object 
item.b = @"b1"; 
[_array addObject:item];