错误的减量错误,代码审查

时间:2011-10-05 01:40:50

标签: objective-c memory-management

下面的代码按预期工作,在没有Zombies的情况下清理。此方法所在的类是正在发布的节点的所有者,但是,在“分析”时,将显示以下两个问题。

如果可能的话,你能帮我理解原因吗?

enter image description here

- (void) dealloc {  
    NSLog(@"Releasing [Doubly Linked List] .. ");

    Node *thisNode = [self firstNode]; 
    Node *nextNode = [thisNode next];

    while (nextNode != nil) {

        // If "Next node" is not nil, it means that
        //   "previous node" can now be released

        NSLog(@"    - releasing node \"%c\"", [[nextNode previous] charData]);
        [[nextNode previous] release];

        nextNode = [nextNode next];
    }

    [[self lastNode] release];
    [super dealloc];
}

2 个答案:

答案 0 :(得分:1)

点击邮件左侧的图标,它将显示产生错误的代码的路径。

您正在发布您不拥有的内容[nextNode previous]。特别是你没有分配或保留它,也没有从一个以new或copy开头的方法获取它,所以你没有它的所有权,不应该释放它。

发布不在您班级中的内容[[nextNode previous] release]

也很常见

现在:[[self lastNode] release];
如上所述,您没有获得您要发布的对象的所有权。

如果lastNode是一个带保留的属性,那么你正在颠覆setter,稍后通过setter将值赋给lastNode时,对象上会有一个额外的释放,可能会崩溃。如果它不再是属性,那么释放由方法调用返回的内容是非常不标准的。

任何包含此格式[[self lastNode] release]代码的版本都是非标准版本,如果避免,则所有权(保留/发布)问题将会减少。

通过研究Apple内存管理文档,您将节省大量时间和精力。

答案 1 :(得分:1)

问题是你没有按照Objective C的普通内存管理惯例做事,而静态分析器却变得混乱。基本上,Objective C类分配一个对象“拥有”该对象并负责释放它。在这里,您没有使用这些约定,因此分析器抱怨,即使您正在做的事情正常。

有关ownership的更多信息,请参阅Apple的文档。