关于NSMutableArray,指针和发布的问题

时间:2011-09-01 15:01:22

标签: objective-c

NSMutableArray的addObject方法究竟是如何工作的?它是创建一个新实例并将其添加到数组中还是只是将对SAME对象的引用添加到数组中?

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

假设我的一个类中有以下方法('list'是一个NSMutableArray),很高兴,这段代码按照我想要的方式工作,但我似乎并不完全理解为什么:

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

所以基本上在调用[list addObject:newItem]之后,现在总有两个引用指向同一个对象(newItem,另一个指向'list'数组)?

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

3 个答案:

答案 0 :(得分:2)

使用方法NSMutableArrayaddObject:添加对象时,retain已添加object。这就是为什么您可以稍后release使用objectAtIndex:方法进行访问后使用。

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

了解releasedealloc之间的区别非常重要。 release只是递减“保留计数”,除了当计数递减到零时,release继续到dealloc对象。

一般情况下(除非另有说明),当您将对象引用(即指针)传递给Objective-C对象时,它会保留该引用的副本超出您对其的调用持续时间,{{ 1}}代表自己的对象,当对象本身被释放时,或当引用的副本被取消或被覆盖时,它负责retain对象。

相关问题