iphone:如何解决NSArray内存泄漏问题?

时间:2011-10-11 08:32:45

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

我正在发布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;    
}

enter image description here

如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

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

中释放它们
-(void) dealloc
{
    [zoneName release];
    [lsdName release];
    [standLat release];
    [standLong release];
    [super dealloc];
} 

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

创建的副本相同

答案 1 :(得分:2)

componentsSeparatedByString:会返回自动释放的NSArray。你不应该自己释放,但最接近的NSAutoreleasePool会为你做到这一点。在第61行,你是在释放数组。

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

for (...)
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    // your loop contents.

    [pool drain];
}