Iphone MapKit内存泄漏。不知道为什么

Iphone MapKit内存泄漏。不知道为什么,iphone,cocoa-touch,memory-management,memory-leaks,Iphone,Cocoa Touch,Memory Management,Memory Leaks,我正在设备上的仪器中运行泄漏工具。我得到了MKReverseGeocoder、mkReverseGeoDerInternal和NSCFString的泄漏(指向-(void)reverseGeocoder:didFindPlacemark)。我已经对这些泄漏进行了2天多的工作,但找不到解决方案。如果有人能给我指出正确的方向,我将非常感激 H 在viewDidLoad方法中,可以如下设置reverseGeocoder属性: self.reverseGeocoder = [[MKReverseGeoc

我正在设备上的仪器中运行泄漏工具。我得到了MKReverseGeocoder、mkReverseGeoDerInternal和NSCFString的泄漏(指向-(void)reverseGeocoder:didFindPlacemark)。我已经对这些泄漏进行了2天多的工作,但找不到解决方案。如果有人能给我指出正确的方向,我将非常感激

H


viewDidLoad
方法中,可以如下设置
reverseGeocoder
属性:

self.reverseGeocoder = [[MKReverseGeocoder alloc] initWithCoordinate:locCoord];
这会泄漏,因为属性设置程序已保留该对象。设置属性后,需要释放或自动释放
MKReverseGeocoder
实例,例如:

self.reverseGeocoder = [[[MKReverseGeocoder alloc] initWithCoordinate:locCoord] autorelease];

您肯定在这里泄漏内存:

    self.loc = [[MKPlacemark alloc] initWithCoordinate:locCoord 
                                     addressDictionary:locDict];
由于您已将
loc
定义为
retain
属性,分配给该属性将调用参数上的
retaining
,最终将得到一个
MKPlacemark
,该属性将被保留,且永远不会被释放

我将把这一行改为:

    self.loc = [[[MKPlacemark alloc] initWithCoordinate:locCoord 
                                     addressDictionary:locDict] autorelease];

此外,请仔细检查您的代码,以了解此模式,因为正如@omz所建议的,您在分配给
reverseGeocoder

时也在这样做。我发现Mapkit也到处都在泄漏—即使您正在实现一个非常基本的现成映射,您是否也可以发布头文件,以便我们可以查看如何声明属性?(非原子,保留)标题即将出现…您是否也保留代理?我建议将代理设置为分配,这样就没有保留周期。您可以进一步解释吗?我很困惑..我添加了self.mapView.delegate=self;[self.reverseGeocoder release]行吗?我仍然不明白我为什么要释放你声明保留的财产(见页眉),因此,
self.reverseGeocoder=…
将自动向您用作属性的对象发送一个
retain
。由于您需要平衡每个
alloc init
retain
与相应的
释放
自动释放
,因此您缺少一个
释放
。谢谢,这是一个错误的模式在我的代码中。感谢您指出,是否有任何地方可以让我进一步了解为什么这是一个漏洞?我仍然很难理解它…我将从这里开始:
    self.loc = [[MKPlacemark alloc] initWithCoordinate:locCoord 
                                     addressDictionary:locDict];
    self.loc = [[[MKPlacemark alloc] initWithCoordinate:locCoord 
                                     addressDictionary:locDict] autorelease];