Где утечка? - PullRequest
       1

Где утечка?

0 голосов
/ 08 февраля 2011

Я не понимаю! Приборы показывают мне утечку в этом методе

-(void)loadData
{
    if (locationData != nil) {
        [locationData release];
    }

self.locationData = [[NSMutableArray alloc] init];

NSData *recievedData = [NSData dataWithContentsOfURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://htmlwin001.******.net/blutalkasp/locations2.asp?uid=%@&von=%d&bis=%d", [[UIDevice currentDevice] uniqueIdentifier], von, bis]]];

NSString *recievedString = [[NSString alloc] initWithData:recievedData encoding:NSUTF8StringEncoding];

SBJsonParser *json = [[SBJsonParser alloc] init];
NSMutableDictionary *jsonData = [json objectWithString : recievedString];

NSString *tmpLocationData;
for (NSDictionary *location in [jsonData objectForKey:@"items"]) {
    Location *newLocation = [[Location alloc] init];
    tmpLocationData = [[NSString alloc]initWithFormat:@"%@", [location objectForKey:@"id"]];
    [newLocation setLocationID:tmpLocationData];
    [tmpLocationData release];
    tmpLocationData = [[NSString alloc]initWithFormat:@"%@", [[location objectForKey:@"locationname"] gtm_stringByUnescapingFromHTML]];
    [newLocation setLocationName:tmpLocationData];
    [tmpLocationData release];
    tmpLocationData = [[NSString alloc]initWithFormat:@"%@",[location objectForKey:@"locationdistance"]];
    [newLocation setLocationDistance:tmpLocationData];
    [tmpLocationData release];
    tmpLocationData = [[NSString alloc]initWithFormat:@"%@", [[location objectForKey:@"locationaddress"] gtm_stringByUnescapingFromHTML]];
    [newLocation setLocationAdress:tmpLocationData];
    [tmpLocationData release];
    tmpLocationData = [[NSString alloc]initWithFormat:@"%@", [[location objectForKey:@"locationdescription"] gtm_stringByUnescapingFromHTML]];
    [newLocation setLocationDescription:tmpLocationData];
    [tmpLocationData release];

    NSNumber *tmpLocationLat = [[NSNumber alloc] initWithInteger:[[location objectForKey:@"locationlatitude"]integerValue]];
    [newLocation setLocationPositionLat:tmpLocationLat];
    [tmpLocationLat release];

    NSNumber *tmpLocationLng = [[NSNumber alloc] initWithInteger:[[location objectForKey:@"locationlongitude"]integerValue]];
    [newLocation setLocationPositionLng:tmpLocationLng];
    [tmpLocationLng release];

    NSString *URL;
    URL = [location objectForKey:@"locationimage1"];
    URL = [URL stringByReplacingOccurrencesOfString:@"[SLASH]" withString:@"/"];
    NSString *tmpUrl1 = [[NSString alloc]initWithFormat:@"http://htmlwin001.******.net/blutalkasp/locationimages/data/%@", URL];
    [newLocation setLocationImageURL1:tmpUrl1];
    [tmpUrl1 release];

    URL = [location objectForKey:@"locationimage2"];
    URL = [URL stringByReplacingOccurrencesOfString:@"[SLASH]" withString:@"/"];
    NSString *tmpUrl2 = [[NSString alloc]initWithFormat:@"http://htmlwin001.******.net/blutalkasp/locationimages/data/%@", URL];
    [newLocation setLocationImageURL2:tmpUrl2];
    [tmpUrl2 release];

    URL = [location objectForKey:@"locationimage3"];
    URL = [URL stringByReplacingOccurrencesOfString:@"[SLASH]" withString:@"/"];
    NSString *tmpUrl3 = [[NSString alloc]initWithFormat:@"http://htmlwin001.******.net/blutalkasp/locationimages/data/%@", URL];
    [newLocation setLocationImageURL3:tmpUrl3]; //Leak geschlossen
    [tmpUrl3 release];

    [self.locationData addObject:newLocation];

    [newLocation release];
}   
[recievedString release];
[json release];

}

Возможно ли, что [nsdictionaryobject objectForKey:@"xy"]; вызывает утечку?

Потому что в инструменте особенно эти линии окрашены. Как видите, я выпускал все. Я довольно отчаянно с этим приложением. Я даже начал заменять все удобные конструкторы через alloc / init / release (например, initWithFormat вместо stringWithFormat). Особенно в петлях!

Но иногда даже инструменты ломаются!

Ответы [ 2 ]

3 голосов
/ 08 февраля 2011
if (locationData != nil) {
        [locationData release];
    }


self.locationData = [[NSMutableArray alloc] init];

Этот паттерн смертелен;вы непосредственно освобождаете переменную экземпляра, потенциально оставляя за собой висячий указатель, а затем присваиваете значение с помощью метода set (через синтаксис точки).

Метод set сначала попытается освободить locationData.

Единственная причина, по которой он не падает - как указал Джо, - это то, что вы в первую очередь чрезмерно сохраняете locationData.

За пределами -dealloc используйте self.locationData = nil; для выпуска иобнулить переменную экземпляра.

3 голосов
/ 08 февраля 2011

Если свойство locationData установлено на сохранение, вы создаете утечку памяти в следующей строке

//This is what is probably leaking
self.locationData = [[NSMutableArray alloc] init];
//Change that to
self.locationData = [[[NSMutableArray alloc] init] autorelease];

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

Это может привести кновая проблема для вас со следующими строками

//Remove this check to release locationData because the property will properly 
//handle memory management for you just by setting it
if (locationData != nil) {
    [locationData release];
}
...