2011-10-11 105 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]; 
}