【问题标题】:iOS: Xcode 4.2: Leaks Instrument says I have a leak with my NSMutableArray and NSMutableDictionary but I don't see whereiOS:Xcode 4.2:Leaks Instrument 说我的 NSMutableArray 和 NSMutableDictionary 有泄漏,但我看不到在哪里
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

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