【问题标题】:iphone: How to solve NSArray memory Leak?iphone:如何解决 NSArray 内存泄漏?
【发布时间】:2011-12-05 02:46:06
【问题描述】:

我正在发布 NSArray 和 NSMutableArray 但它显示内存泄漏。而 ZoneData 代码是这样的

-(ZoneData*) initWithZoneName:(NSString *)zoneNameIn SdName:(NSString *)sdNameIn eCount:(NSString *)eCountIn iCount:(NSString *)iCountIn StandLat:(NSString *)standLatIn StandLong:(NSString *)standLongIn
{
    self = [super init];
    if (self)
    {
        zoneName = [zoneNameIn copy];
        lsdName = [sdNameIn copy];

        leCount = [eCountIn intValue];
        liCount = [iCountIn intValue];
        standLat =  [standLatIn copy];
        standLong = [standLongIn copy];     
    }

    return self;    
}

如何解决?

【问题讨论】:

  • 你应该在 zoneNamelsdNamestandLatstandLong ZoneData 的 i>dealloc 方法。
  • 为什么要在 forloop 的每次迭代中分配 ZoneData *data?虽然你也可以在之前做。

标签: iphone objective-c memory-management memory-leaks nsarray


【解决方案1】:

问题在于您的实例变量。在您的-init 中,您正确地将它们分配给数组中字符串的副本。但是,您也不需要在-dealloc 中发布它们。

-(void) dealloc
{
    [zoneName release];
    [lsdName release];
    [standLat release];
    [standLong release];
    [super dealloc];
} 

现在,您可能会问为什么泄漏工具会告诉您泄漏是您在其中创建带有字符串的NSArray 而不是 init 方法的位置。原因是不可变对象的-copy 被优化为除了将保留发送到self 之外什么都不做。因此,您作为实例变量拥有的那些副本实际上与 -componentsSeparatedByString: 创建的对象相同

【讨论】:

    【解决方案2】:

    componentsSeparatedByString: 返回一个自动释放的NSArray。你不应该自己发布它,但最接近的NSAutoreleasePool 会为你这样做。在第 61 行,您过度释放了数组。

    如果您在执行循环时担心内存使用情况,您可以在循环的每次迭代中清除自动释放的对象:

    for (...)
    {
        NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    
        // your loop contents.
    
        [pool drain];
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-28
      • 1970-01-01
      • 1970-01-01
      • 2021-11-18
      • 2018-04-11
      • 2020-04-07
      相关资源
      最近更新 更多