2010-12-06 48 views
0

假設您有幾個Class對象聲明並將其添加到NSMutableArray中,那麼您可以修改Class對象和NSMutableArray對象。怎麼了?當你添加一個類到NSMutableArray並且你改變了這個對象和數組時,會發生什麼?

代碼示例:

MyClass *item1; 
MyClass *item2; 
NSMutableArray *itemHolder; 

item1 = [[MyClass alloc] init]; 
item2 = [[MyClass alloc] init]; 
itemHolder = [[NSMutableArray alloc] initWithObjects:item1,item2,nil]; 

-(void)someFunction{ 
    [item1 setVarName:@"item1"]; 
    [item2 setVarName:@"item2"]; 
    for(MyClass *items in itemHolder) [items setVarName:@"item"]; 
} 

我覺得我平時釋放物品1和ITEM2將它變成itemHolder之後,但它不會破壞內存管理規則吧?因爲在dealloc中結束時,你仍然可以當你添加的對象(ITEM1和ITEM2)的數組,數組只是存儲指針釋放一切

-(void)dealloc{ 
    [item1 release]; 
    [item2 release]; 
    [itemHolder release]; 
} 

回答

1

。該對象本身不被複制。

所以,當你setVarName的物品1或setVarName上在NSArray中的第一個項目,兩個動作都影響着完全相同的對象(同一實例)

至於內存MGMT,當您添加項目到NSArray的,NSArray(可變或不可變)將保留它們中的每一個。當數組被釋放時,它將釋放它們中的每一個。

如果您有其他需要單獨保留每個項目,那麼您應該這樣做(如在您的示例中)。但是請記住,在正常的程序中,你更經常地將新對象添加到數組中,並在數組保留它們之後立即釋放它們。

但是,如果不看一個具體的例子就很難一概而論。

+0

感謝您的回覆。 – okysabeni 2010-12-07 18:55:25

0

如果您嘗試發佈已發佈的內容,那麼您可能會遇到EXC_BAD_ACCESS或段錯誤。儘量確保不要兩次釋放同一個對象。

如果鬆開數組中包含的和後來的對象釋放ITEM1或ITEM2,你會被兩次從兩個不同的引用

釋放同一個對象如果更改類對象則數組中的版本將是也受到影響,反之亦然。

相關問題