我的头文件中有一个属性为
@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]
时,'错误的减量...'错误消失了。但是关于潜在泄漏的前一个错误仍然存在。有什么问题?
答案 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];