下面的代码按预期工作,在没有Zombies的情况下清理。此方法所在的类是正在发布的节点的所有者,但是,在“分析”时,将显示以下两个问题。
如果可能的话,你能帮我理解原因吗?
- (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];
}
答案 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的文档。