仪器生活计数和/或保留计数问题

时间:2010-06-28 15:46:13

标签: iphone objective-c ipad

我遇到了一个我不理解的保留计数问题。 (我在每行代码的末尾添加了我认为是[]中保留的顶点数)。

CBVertex *vertex = nil;
for(int i=0; i<10; i++) {
    vertex = [[CBVertex alloc] initWithFrame:CGRectMake(minX, y, 10.0, 10.0)]; // retain count [1]
    [vertex setTag:i];
    [vertex setAnimationDelegate:self];
    [gameboard addSubview:vertex];   // retain count [2]
    [tripGraph addVertex:vertex];    // retain count [3]
    [vertex release]; vertex=nil;    // retain count [2]
}

CBVertex是UIView的子类,gameboard是UIView,tripGraph是一个类,除其他外,还有一个NSMutableArray(privateVerticies),在其addVertex方法中将顶点添加到其中。

执行上述操作后,仪器显示有10个CBVertex生存实例。

稍后在代码执行中(我已确认此代码执行):

[[tripGraph verticies] makeObjectsPerformSelector:@selector(removeFromSuperview)];
// gameboard should have no references to any of the CBVertex's (correct??)

[tripGraph removeAllVerticies]; 
// tripGraph privateVerticies is empty and  no references to any of 
// the CBVertex's (correct?)

相关tripGraph方法:

-(NSArray *) verticies {
   return [NSArray arrayWithArray:privateVerticies];
}

-(void) tripGraph removeAllVerticies {
   [privateVerticies removeAllObjects];
}

- (void) addVertex:(CBVertex *)vertex {
   [privateVerticies addObject:vertex];
}

当创建第二组CBVertex时会出现问题。仪器显示第一组CBVertex仍处于活动状态(即CBVertex的实例数目现在为20)。

我(很明显?)在某个地方错过了一个版本,但不明白在哪里。 。 。

欢迎帮助/指示!!

感谢

汤姆

3 个答案:

答案 0 :(得分:0)

如果gameboardtripGraph仍然保留CBVertex个对象,那么即使您在循环中释放它,它也将继续存在,直到您删除CBVertex来自gameboardtripGraph的对象。

答案 1 :(得分:0)

好的,我正在关闭这个,因为上面的代码是正确的。问题在于我重写了removeFromSuperview方法,其中有一个动画正在进行中。我将进一步调查,如果我没有弄明白,我会重新发布一个新问题。 (并从这里链接到它)。

感谢您的评论,回答和几个观点。

答案 2 :(得分:0)

对于那些感兴趣的人,这里是发生了什么以及如何解决。

在CBVertex中,我已经覆盖了removeFromSuperview。在该重写方法中,我正在为视图的图层设置动画并将视图设置为CAAnimations委托(由CAAnimation保留)并调用super removeFromSuperview。完成时不会删除动画。

由于动画保留了代理,动画未被删除,因此视图的保留计数保持为+1。

我的决心是创建一个执行动画的中间方法。当动画完成时,它会调用覆盖removeFromSuperview,现在只删除所有动画并调用super。删除动画会释放它,然后释放它对它的委托(CBVertex)的引用,并且CBVertex的保留计数变为+0。

对于任何追逐保留计数的人来说,最后一个想法是:不要将它们视为绝对值。您可能正在使用的对象的内部工作方式可能会比您预期的更多地保留您的实例 - 将保留计数视为增量。

SomeClass *myObject = [[SomeClass alloc] init]; // retain count +1
[someMutableSet addObject:myObject]; // retain count +2