代码之家  ›  专栏  ›  技术社区  ›  TomH

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

  •  0
  • TomH  · 技术社区  · 15 年前

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

    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(privateVertices),vertex在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 回复  |  直到 15 年前
        1
  •  0
  •   indragie    15 年前

    如果 gameboard tripGraph CBVertex 对象,则即使在循环中释放它,它仍将继续存在,直到移除 CBVertex公司 对象来自 也。

        2
  •  0
  •   TomH    15 年前

    好的,我结束这个,因为上面的代码是正确的。问题在于我重写的removeFromSuperview方法中存在动画。我将进一步调查,如果我没有弄清楚,我会重新提出一个新问题(并从这里链接到它)。

    谢谢你的评论,回答和几点看法。

        3
  •  0
  •   TomH    15 年前

    在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
    
    推荐文章