Objective c NSMutableDictionary-“不可更改的字典”;对象的引用计数递减不正确…“;

Objective c NSMutableDictionary-“不可更改的字典”;对象的引用计数递减不正确…“;,objective-c,memory-management,Objective C,Memory Management,我的头文件中有一个属性 @property(非原子,保留)NSMutableDictionary*e 在我的viewDidLoad:method中 self.e=[[NSMutableDictionary alloc]initWithContentsOfURL:myURL] XCode静态分析仪被触发,并明显地显示“物体的潜在泄漏…”。但是,当我释放对象时([self.e release]in dealloc),错误仍然存在,但现在它还表示“引用计数的减少不正确”,并且该对象不属于调用方(我的v

我的头文件中有一个属性

@property(非原子,保留)NSMutableDictionary*e

在我的viewDidLoad:method中

self.e=[[NSMutableDictionary alloc]initWithContentsOfURL:myURL]

XCode静态分析仪被触发,并明显地显示“物体的潜在泄漏…”
。但是,当我释放对象时(
[self.e release]
in dealloc),错误仍然存在,但现在它还表示“引用计数的减少不正确”,并且该对象不属于调用方(我的viewController)

当我用简单的
[e release]
替换
[self.e release]
时,“不正确的减量…”错误消失了。但之前关于潜在泄漏的错误仍然存在。有什么问题吗?

这句话:

self.e = [[NSMutableDictionary alloc] initWithContentsOfURL:myURL];
过度保留对象。alloc init和属性都保留该对象

就所有权而言,您拥有alloc init返回的对象,并通过在属性访问器中向其发送retain消息,再次声明该对象的所有权,这导致该对象被过度保留

您可以使用一个方便的构造函数,它返回一个对象yo not own,并让属性访问器声明它的所有权:

self.e = [NSMutableDictionary dictionaryWithContentsOfURL:myURL];
或使用自动释放:

self.e = [[[NSMutableDictionary alloc] initWithContentsOfURL:myURL] autorelease];
或使用临时变量:

NSMutableDictionary *tempDict = [[NSMutableDictionary alloc] initWithContentsOfURL:myURL];
self.e = tempDict;
[tempDict release];
问题是:

self.e = [[NSMutableDictionary alloc] initWithContentsOfURL:myURL];
您的属性
e
设置了保留标志。因此,在它保留它之后,您将保留计数增加了两个。您应该在将对象移交给属性后释放该对象

self.e = [[[NSMutableDictionary alloc] initWithContentsOfURL:myURL] autorelease];

此外,“dealloc中的[self.e release]是错误的。你应该在dealloc中发布私有ivar<代码>[e release]
[\u e release]
取决于您的合成方式。当然,@JackLawrence。我没有提到这一点,因为OP写道:“当我将
[self.e release]
简单地替换为
[e release]。
”时,
'error decreation…“
错误就消失了,所以我假设
'error decreation…”
错误是固定的,并且只解释了
'object的潜在泄漏…
错误。