NSMutableDictionary - “对象引用计数的不正确减少...”

时间:2011-07-21 15:20:08

标签: objective-c memory-management

我的头文件中有一个属性为

@property (nonatomic,retain) NSMutableDictionary* e;

并在我的viewDidLoad:方法中将其分配为

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

触发了XCode静态分析器,显然是'Potential leak of an object...'。但是当我释放对象(dealloc中的[self.e release])时,错误仍然存​​在,但现在它也说“引用计数的错误减少”,并且该对象不属于调用者(my的viewController)。

当我用[self.e release]替换[e release]时,'错误的减量...'错误消失了。但是关于潜在泄漏的前一个错误仍然存​​在。有什么问题?

2 个答案:

答案 0 :(得分:2)

本声明:

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

过度保留对象。 alloc-init和属性都保留了对象。

就所有权而言,您拥有 alloc-init返回的对象,并在属性访问者中向其发送保留消息,您再次声明其所有权,这会导致对象超过保留

您可以使用便利构造函数,它返回一个对象你不拥有,并让属性访问者声明对它的所有权:

self.e = [NSMutableDictionary dictionaryWithContentsOfURL:myURL];

或者使用自动释放:

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

或使用临时变量:

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

答案 1 :(得分:0)

问题是:

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

您的媒体资源e已设置保留标记。因此,在保留它之后,您将保留计数增加了两倍。您应该在将对象交给财产后将其释放。

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