【问题标题】:Question about NSMutableArray, pointers and release关于 NSMutableArray、指针和释放的问题
【发布时间】:2011-11-08 11:48:59
【问题描述】:

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 对象,并没有清除“列表”NSMutableArray 中的那个呢?它们不是指向同一个对象吗?

【问题讨论】:

    标签: objective-c


    【解决方案1】:

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

    【讨论】:

    • 啊,是的,我现在明白了!感谢您的回答
    【解决方案2】:

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

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

    【讨论】:

    • 我明白了!谢谢。现在要查看保留计数
    【解决方案3】:

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

    一般来说(除非另有说明),当您将对象引用(即指针)传递给 Objective-C 对象时,它会在您调用它的持续时间内保留该引用的副本,@987654326以自己的名义@s 对象,当对象本身被释放,或者引用的副本被无效或覆盖时,它负责release 对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-09
      • 1970-01-01
      • 2018-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-13
      相关资源
      最近更新 更多