iphone: как решить утечку памяти NSArray? - PullRequest
0 голосов
/ 11 октября 2011

Я выпускаю 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 ]

2 голосов
/ 11 октября 2011

componentsSeparatedByString: возвращает автоматически выпущенный NSArray.Вы не должны выпускать это сами, но самые близкие NSAutoreleasePool сделают это за вас.В строке 61 вы перевыпускаете массив.

Если вы беспокоитесь об использовании памяти при выполнении цикла, вы можете очистить автоматически выпущенные объекты на каждой итерации цикла:

2 голосов
/ 11 октября 2011

Проблема в переменных вашего экземпляра.В вашем -init вы правильно присваиваете им копии строк из массива.Тем не менее, вам также необходимо выпустить их в -dealloc.

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

Теперь вы можете спросить, почему инструмент утечки сообщает вам, что утечки - это то, где вы создаете NSArray со строкамивместо метода init.Причина в том, что -copy для неизменяемых объектов оптимизировано, чтобы ничего не делать, кроме отправки retain на self.Таким образом, те копии, которые у вас есть в качестве переменных экземпляра, в действительности являются теми же объектами, что были созданы -componentsSeparatedByString:

...