簡體   English   中英

iPhone:如何解決NSArray內存泄漏?

[英]iphone: How to solve NSArray memory Leak?

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

在此處輸入圖片說明

如何解決呢?

問題是您的實例變量。 -init ,您正在正確地將它們分配給數組中字符串的副本。 但是,您還需要在-dealloc釋放它們。

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

現在,您可能會問為什么泄漏工具告訴您泄漏是在其中使用字符串而不是init方法創建NSArray地方。 原因是針對不可變對象的-copy優化了,除了將保留發送給self之外,什么也不做。 因此,您擁有作為實例變量的那些副本實際上是與-componentsSeparatedByString:創建的對象相同的對象-componentsSeparatedByString:

componentsSeparatedByString:返回一個自動釋放的NSArray 您不應該自己釋放它,但是最接近的NSAutoreleasePool將為您做到這一點。 在第61行中,您過度釋放了數組。

如果您在執行循環時擔心內存使用情況,則可以在每次循環中清除自動釋放的對象:

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

    // your loop contents.

    [pool drain];
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM