2011-09-01 90 views
0

NSMutableArray的addObject方法究竟如何工作?它是否会创建一个新实例并将其添加到数组中,还是只是将对SAME对象的引用添加到数组中?关于NSMutableArray,指针和版本问题

如果答案是只插入一个参考对象,那么它导致了我的下一个问题:

比方说,我有以下方法(是NSMutableArray的“列表”)我的课之一,很高兴,这个代码工作我想要的方式,但我似乎就是不完全理解为什么:

-(void)buyItem:(Item *)anItem 
{ 
    Item * newItem = [[Item alloc]init]; 
    newItem.name = anItem.name; 
    newItem.details = anItem.details; 
    [list addObject:newItem]; 
    [newItem release]; 
} 

所以基本上打完电话后[名单ADDOBJECT:的newitem],就现在共有两个参考指向的相同的对象权利(newItem,和'列表'数组中的另一个)?

但是,为什么在这里释放newItem对象,不会清除'list'中的那个NSMutableArray?他们不是指向同一个对象吗?

回答

2

当您使用方法addObject:将对象添加到NSMutableArray时,它添加了retain s object。这就是为什么您可以稍后使用release并且之后通过使用objectAtIndex:方法访问的方法。

+0

啊是的,我有点得到它!谢谢你的回答 – lucas32

1

它添加一个引用,然后增加对象保留计数一。你所做的是正确的,它仍然存在于数组中,保留数为1。

供您参考。 What increases an object's retain count?

+0

我明白了!谢谢。现在要查看保留计数 – lucas32

0

理解releasedealloc之间的区别很重要。 release简单地递减“保留计数”,除了当计数递减到零时,release继续到dealloc对象。

一般情况下(除另有说明外),当您将对象引用(即指针)传递给Objective-C对象,并且在您调用该对象的持续时间之后它保留该引用的副本时,它retain作为自己的对象,并且它在对象本身解除分配时,或者当引用的副本被取消或覆盖时负责对象release