Iphone 在Dealoc中使用IVAR上的self?

Iphone 在Dealoc中使用IVAR上的self?,iphone,objective-c,cocoa-touch,Iphone,Objective C,Cocoa Touch,通常我写我的dealloc时是这样的: - (void)dealloc { [coffeeList release]; [super dealloc]; } 但是今天我输入了(见下文),有点困惑,为什么通过叮当作响的静态分析器运行代码时出错。正如我所说,我通常不会在dealloc中向iVars添加self,但当我发现这是怎么回事时,我有点好奇 - (void)dealloc { [[self coffeeList] release]; [super deallo

通常我写我的dealloc时是这样的:

- (void)dealloc {
    [coffeeList release];
    [super dealloc];
}
但是今天我输入了(见下文),有点困惑,为什么通过叮当作响的静态分析器运行代码时出错。正如我所说,我通常不会在dealloc中向iVars添加self,但当我发现这是怎么回事时,我有点好奇

- (void)dealloc {
    [[self coffeeList] release];
    [super dealloc];
}

gary。

我只是猜测,clang通知
[self.something]release
(或
[self.something release]
)违反了内存管理约定。从名称中没有“new”、“init”或“copy”的方法返回的对象应该自动释放,因此再次释放它似乎是过度释放错误。

因为这是一种非常糟糕的形式,不符合您应该做的事情。CSA不仅仅检查语义错误,它还检查您是否按照自己应该的方式做事。您应该采用的方式是文档中的操作方式。

是否将coffeeList声明为属性(并设置为保留)?那么你可能应该做:

[self.coffeeList release];

[self.coffeeList release]和[[self-coffeeList]release]是完全相同的调用取而代之。确保你首先删除
咖啡列表上的观察者,如果有,否则他们会被调用寻找正在消失的对象。我只是objective-c的新手,但在我看来这两个[[自我咖啡列表]都是释放的];和[咖啡列表发布];看起来是一样的。虽然看起来语法确实混淆了LLVM1.5Clang,但它们并不相同。内存管理规则告诉您只释放自己拥有的对象。这里发生的是
[self coffeeList]
拥有
coffeeList
,而不是你。它实现的基本原理是:
return[[coffeeList retain]autorelease]
如果你知道你的规则,这意味着它拥有coffeeList,并将在将来的任意时间发布。你需要直接释放ivar本身。谢谢你,jer,正是我想要的,我想知道发生了什么,现在我明白了。非常感谢。。。