2010-10-23 87 views
1

作为Iphone开发者的一个小白,只是试图理解。IPhone NSMutableArray内存管理

在下面的代码中,发生了什么事?

City *newCity = [[City alloc] init]; 
newCity.name = @"name"; 

NSMutableArray *array = [[NSMutableArray alloc] init]; 
[array addObject:newCity]; 

City *getCity = [array objectAtIndex:0]; 

[city release]; 
[array release]; 

当你向数组中添加一个对象时,数组是做一个保留还是它创建一个全新的实例?

另外当我做一个objectAtIndex检索城市。我想释放它吗?我假设没有,因为我不拥有它?这是我应该怎么想的?

另外,当我在数组上发布时,是否遍历数组中的所有对象并调用这些对象上的发布?

回答

3

你所有的假设都是正确的。

如果你认为所有权你永远是对的,(除了一些有据可查的例外)。

City *newCity = [[City alloc] init]; //newCity is +1 
newCity.name = @"name"; //name +1 

NSMutableArray *array = [[NSMutableArray alloc] init]; //array +1 
[array addObject:newCity]; //new city +1 

City *getCity = [array objectAtIndex:0]; //no memory change 

[city release]; //assuming this was supposed to be newCity, newCity -1, 
[array release]; //array -1, array deallocs, calling release on all its objects, newCity -1, deallocs 
1

将对象添加到数组时,数组将保留该对象。

如果您使用 - [NSArray objectAtIndex:idx],则保留计数不会递增,您不会“拥有”您获得的对象,而且您也不需要释放它。除非你显然在你从数组中获得后才选择保留它。

是的,当数组被释放时,它将释放数组中的每个对象。 (这与释放阵列时释放它们并不相同,只有当数组被释放时才会发生这种情况)