NSMutableArray和ARC

时间:2014-09-10 00:11:13

标签: nsmutablearray automatic-ref-counting

我正在尝试使用以下代码将对象添加到NSMutableArray:

Item *newItem = [[Item alloc] init];
[self.theArray addObject:newItem];

如果我没记错的话,回到旧的保留/发布日,我不必担心newItem变量超出范围,因为该对象在收到时会收到retain添加到数组中,因此不会被释放。

但我现在正在使用ARC,对象消失了。数组本身很好,它包含的其他对象不受影响。所以我怀疑我的newItem由于某种原因被自动解除分配。

有人可以告诉我这里发生了什么,以及我如何解决它?

2 个答案:

答案 0 :(得分:1)

Item *newItem = [[Item alloc] init];

// This line is the same as this
//
// __strong Item *newItem = [[Item alloc] init];
//
// the newItem variable has strong reference of the Item object.
// So the reference count of the Item object is 1.

[self.theArray addObject:newItem];

// Now theArray has strong reference of the Item object.
// So the reference count of the Item object is 2.

Item对象的引用计数为2,因此不会释放Item对象。如果您的代码具有如下范围,

{
    Item *newItem = [[Item alloc] init];
    [self.theArray addObject:newItem];
}

它不会影响Item对象。

{
    Item *newItem = [[Item alloc] init];
    [self.theArray addObject:newItem];
    // the reference count of the Item object is 2 as I said.
}
// The scope of the newItem variable was ended.
// So the lifetime of the newItem variable was ended,
// then the strong reference by the newItem was gone.
// Thus the reference count of the Item object was reduced from 2 to 1.

Item对象的引用计数为1,因此也不会释放Item对象。

答案 1 :(得分:0)

我终于发现了什么是错的。它与分配无关。发生了什么事情是在重新加载表视图时再次调用awakeFromNib方法。当然,重置各种东西,使东西消失。