2011-10-11 111 views
0

我正在发布NSArray和NSMutableArray,但它显示内存泄漏。而ZoneData代码是这样的iphone:如何解决NSArray内存泄漏?

-(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;  
} 

enter image description here

如何解决这个问题?

+0

你应该释放* ZONENAME *,* lsdName *,* standLat * * StandLong * * ZoneData *的* dealloc *方法。 – EmptyStack

+0

为什么要在forloop的每次迭代中分配ZoneData *数据?而你之前也可以这么做。 –

回答

2

问题是你的实例变量。在您的-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]; 
}