Iphone MapKit内存泄漏。不知道为什么
我正在设备上的仪器中运行泄漏工具。我得到了MKReverseGeocoder、mkReverseGeoDerInternal和NSCFString的泄漏(指向-(void)reverseGeocoder:didFindPlacemark)。我已经对这些泄漏进行了2天多的工作,但找不到解决方案。如果有人能给我指出正确的方向,我将非常感激 HIphone 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
在
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];