Утечка памяти: проблемы с выпуском NSArray в приложении для iPhone - PullRequest
0 голосов
/ 15 апреля 2011

У меня есть код, который показывает утечки в инструментах. Это показывает утечки, где я инициализирую arrayDetPerformance с содержанием arrayDetail

Если я выпускаю arrayDetail, мое приложение вылетает.

Что может быть не так?

Вот код:

    NSDictionary *finalResult = [extractUsers JSONValue];
    //      NSLog(@" Stamp-16 : %@",[NSDate date]);
    NSLog(@"Array2  : %d",[arrayDetail retainCount]);        //RETAIN COUNT IS 0
    arrayDetail = [[finalResult objectForKey:@"Detail"]
    NSLog(@"Array2  : %d",[arrayDetail retainCount]);       //RETAIN COUNT IS 2

    //  NSLog(@"Data is : %@",array1);
    //      NSLog(@" Stamp-17 : %@",[NSDate date]);

    //NSLog(@"Final Value is : %@",[[allUsers objectAtIndex:0] valueForKey:@"password"]);

    //[self setUserData:allUsers];
    //[tblView reloadData];

    [responseString release];
    [request release];

}



//sleep(0.3);
//[inProgressIndicator stopAnimating];
[fileContents release];

//Release all the allocated data
[json release];
//label.text = @"Finish";
//  NSLog(@" Stamp-19 : %@",[NSDate date]);
NSUserDefaults *def = [NSUserDefaults standardUserDefaults];
//NSLog(@"Array2  : %d",[array2 retainCount]);

arrayDetPerformance = [[NSMutableArray alloc] initWithArray:arrayDetail];
chartPoints= [arrayDetPerformance valueForKey:@"Points"];
NSLog(@"Chart Points: %@",chartPoints);
[def setObject:chartPoints forKey:@"yarray"];
[def setObject:@"YES" forKey:@"flagThumb"];

//array1 = [[NSMutableArray  alloc] initWithObjects:@"New",@"Table",@"View",nil];
//[self.Dettable reloadData];
//sNSFileManager *fileManager = [NSFileManager defaultManager];
//[array2 release];
NSLog(@"ArrayDEtPerfomance : %d",[arrayDetPerformance retainCount]);
NSLog(@"array2 : %d",[arrayDetail retainCount]);
if([chartPoints count]>0)
{
    PlotItem *plotItem = [[PlotGallery sharedPlotGallery] objectAtIndex:0];
    [plotItem imageHive:Fund];
}

//[arrayDetail release];

}

Утечка памяти отображается в строке

arrayDetPerformance = [[NSMutableArray alloc] initWithArray:arrayDetail];

Кроме того, меня смущает, почему счет сохранения напрямую изменяется от 0 до 2 в приведенном ниже коде:

NSLog(@"Array2  : %d",[arrayDetail retainCount]);        //RETAIN COUNT IS 0
    arrayDetail = [[finalResult objectForKey:@"Detail"]
NSLog(@"Array2  : %d",[arrayDetail retainCount]);       //RETAIN COUNT IS 2

Что может быть не так?

Ответы [ 4 ]

2 голосов
/ 15 апреля 2011

Это показывает утечку, потому что вы выделяете arrayDetPerformance, а затем не освобождаете ее. Просто как тот. По крайней мере, это то, что мы можем сказать из кода, который вы нам показываете.

Что касается остальных, не используйте retainCount для устранения проблем с памятью, никогда! Вы должны понимать простые правила управления памятью и следовать им, больше ничего. Поскольку вы не знаете, что делает основной код Apple, вы не можете полагаться на счет сохранения объекта.

Что касается вашего вопроса относительно этого кода:

NSLog(@"Array2  : %d",[arrayDetail retainCount]);        //RETAIN COUNT IS 0
arrayDetail = [[finalResult objectForKey:@"Detail"]
NSLog(@"Array2  : %d",[arrayDetail retainCount]);       //RETAIN COUNT IS 2

Вы присваиваете arrayDetail целый другой объект, поэтому совершенно бессмысленно сравнивать какие-либо свойства arrayDetail до и после назначения. Счет сохранения может быть повсюду, и он ничего вам не скажет.

У меня складывается впечатление, что вы действительно не знаете, что делаете здесь. Вы должны читать правила управления памятью снова и снова, пока не разберетесь с ними.

1 голос
/ 15 апреля 2011

Не звоните retainCount

retainCount бесполезно. Абсолютное количество сохраняемых объектов - это деталь реализации. Правило простое; если вы заставляете что-то сохраняться, вы должны сделать так, чтобы это было выпущено, когда вы закончите с этим. Конец истории.

Документация по управлению памятью обсуждает это полностью.

<Ч />

Во-первых, retainCount может никогда не возвращать ноль . Единственный раз, когда вы получите ноль, это если вы попали в сообщение nil. Это:

NSLog(@"Array2  : %d",[arrayDetail retainCount]);        //RETAIN COUNT IS 0
arrayDetail = [[finalResult objectForKey:@"Detail"]
NSLog(@"Array2  : %d",[arrayDetail retainCount]);       //RETAIN COUNT IS 2

Вы заставляете arrayDetail указывать на другой объект во второй строке. Таким образом, нет никакой связи между счетом сохранения до / после этой строки.

Когда утечка говорит вам, что утечка находится на определенной линии, как эта ...

arrayDetPerformance = [[NSMutableArray alloc] initWithArray:arrayDetail];

... он говорит вам, что указанный объект, выделенный на этой линии, был утечкой. Это не говорит вам, что конкретная линия была причиной утечки. Вероятно, утечка произошла из-за того, что вы либо перенесли ее в другое место, либо забыли об утечке.

Вы сказали в нескольких комментариях, что вы «освобождаете [что-то] в своем освобождении». Покажите реализацию вашего метода dealloc.

1 голос
/ 15 апреля 2011

retainCount не поможет вам отладить вашу проблему (на самом деле она почти никогда не будет иметь отношения к отладке, поэтому лучше забыть, что она даже есть).

Не выпускайтеarrayDetail, так как вам это не принадлежит.Проблема с arrayDetPerformance.Вы выделяете объект в этой строке, и он нигде не освобождается.Возможно, вы делаете это в другом месте своего кода, но если это не так, отправьте его release, когда вы закончили его использовать.

Редактировать

Если вы освобождаете arrayDetPerformance в своем методе dealloc, я предполагаю, что это переменная экземпляра?В этом случае вы не можете предполагать, что он еще не указывает на объект, поэтому вам следует отправить его release перед назначением его новому объекту.

В качестве альтернативы, если он настроен каксвойство, просто используйте self.arrayDetPerformance = ..., который позаботится об управлении памятью для вас.

0 голосов
/ 15 апреля 2011

[arrayDetPerformance release];не написано в вашем коде;

Итак, это показывает утечку памяти.

...