【发布时间】:2012-01-18 07:31:53
【问题描述】:
我有以下简单的代码来跟踪我的 MKMapView 中的 MKAnnotations。我在要跟踪的位置列表中循环创建注释。我将注释添加到我的集合类中,即 NSMutableDictionary 和 NSMutableArray,它们是声明的属性(不使用 ARC,而是使用 Xcode 4.2,因此使用“strong”而不是 retain,因为它们被认为是同义词;为了将来与 ARC 兼容)。
如果我再次调用此例程(例如当位置列表更新时),Leaks Instrument 声称注释正在泄漏,以及集合对象本身。 (我在泄漏列表中得到一个 NSMUtableDictionary ,堆栈跟踪指向创建字典并设置到我的属性中的行,我们还有许多与注释匹配的小泄漏,以及对 NSMutableArray 的投诉和 NSMutableDictionary)。但是,我没有看到任何违反内存管理规则的行为。我有一个通过 alloc/init 与我的注释创建配对的版本。我通过我的属性“setter”进行隐式保留,当集合被替换时,它们应该被释放,然后释放它们的所有内容对象。如果有人能看出我哪里出错了,我将不胜感激。
@property(strong, nonatomic) NSMutableArray *annotationList;
@property(strong, nonatomic) NSMutableDictionary *annotationLocations;
.
-(void) createMapAnnotations
{
if ([[self mapView] annotations])
[[self mapView] removeAnnotations:[[self mapView] annotations]];
[self setAnnotationList:[NSMutableArray array]];
[self setAnnotationLocations:[NSMutableDictionary dictionary]];
for (JEstablishmentLocation *loc in [[JLocationManager sharedLocationManager] localLocations])
{
MKPointAnnotation *annotation = [[MKPointAnnotation alloc] init];
[annotation setCoordinate:[[loc estCoordinates] coordinate]];
[[self mapView] addAnnotation:annotation];
[[self annotationList] addObject:[NSDictionary dictionaryWithObject:annotation forKey:[loc estKeyValue]]];
[[self annotationLocations] setObject:loc forKey:[annotation description]];
[annotation release];
}
[self centerOnCurrentLocation];
}
【问题讨论】:
-
您是否尝试过在“丢失”数组和字典之前清除它们?乍一看,您的代码似乎没问题。
-
尽管语义等价,但与保留交换强,仪器是否仍然显示泄漏?这不是 ARC 代码,您确实在 dealloc 中释放了两个 ivars,不是吗?
-
我会尝试交换强/保留。是的,ivars 在 dealloc 中被释放,但控制器对象并没有死,所以它永远不会被调用。
标签: objective-c ios instruments memory-leaks