iOS:Xcode 4.2:Leaks Instrument 说我的 NSMutableArray 和 NSMutableDictionary 有泄漏,但我看不到在哪里

Posted

技术标签:

【中文标题】iOS:Xcode 4.2:Leaks Instrument 说我的 NSMutableArray 和 NSMutableDictionary 有泄漏,但我看不到在哪里【英文标题】:iOS: Xcode 4.2: Leaks Instrument says I have a leak with my NSMutableArray and NSMutableDictionary but I don't see where 【发布时间】: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 中被释放,但控制器对象并没有死,所以它永远不会被调用。 【参考方案1】:

仪器显示泄漏对象的分配位置,它不显示泄漏发生的位置。我的意思是,也许在指定线上分配的对象会导致代码中其他地方的泄漏。

不过,我不知道您的代码是否属于这种情况。

【讨论】:

是的。就我而言,没有其他地方可以处理这些物品。它们只是从这个类的其他地方读取(这是它们被引用的唯一地方)。我开始认为这是一个虚惊一场。仅供参考,静态分析显示此代码没有问题。 在清理所有输出并重建之后,您正在分析您的代码,对吧? 也许我会尝试提取那段代码,将其放入另一个项目并仅分析那一小部分。

以上是关于iOS:Xcode 4.2:Leaks Instrument 说我的 NSMutableArray 和 NSMutableDictionary 有泄漏,但我看不到在哪里的主要内容,如果未能解决你的问题,请参考以下文章

iOS使用Instrument的Leaks查找代码内存泄露

iOS 内存泄漏检测 Instruments Leaks

iOS 内存泄漏检测 Instruments Leaks

iOS 内存泄漏检测 Instruments Leaks

如何使用iOS instruments 中的leaks

Xcode结合Leaks检测内存泄露