Утечка памяти парсера SBJSON - PullRequest
2 голосов
/ 03 августа 2011

Я пытаюсь проанализировать канал JSON, используя SBJSON, но каждый раз, когда я запускаю его через инструменты, я получаю 100% утечку памяти в одной строке. У меня определенно есть что-то неправильное, и я надеялся на некоторое понимание.

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

 SBJsonParser *parser = [[[SBJsonParser alloc] init] autorelease];
            NSString *jsonString = [[NSString alloc] initWithData:[request responseData] encoding:NSUTF8StringEncoding];

        id response = [parser objectWithString:jsonString error:NULL]; //100.0% memory leak

        NSMutableDictionary *peopleDictionary = (NSMutableDictionary *)response;

        NSMutableArray *buildingArray = [[NSMutableArray alloc] init];

        if (peopleDictionary != nil) {
            for (NSDictionary *dict in peopleDictionary) {  
                Person *incoming = [[Person alloc] init];
                incoming.firstName = [dict objectForKey:@"firstName"];
                incoming.lastName = [dict objectForKey:@"lastName"];
                incoming.address = [dict objectForKey:@"address"];
                [buildingFeedArray addObject:incoming];
                [incoming release];
            }
        }
        [jsonString release];
        self.peopleArray = buildingFeedArray;
        [self.tableView reloadData];
        [buildingFeedArray release];

1 Ответ

1 голос
/ 24 декабря 2011

Вы создали NSArray с именем buildingArray, но затем добавили объекты в buildingFeedArray и выпустили buildingFeedArray.

Вам нужно изменить строку 5:

NSMutableArray *buildingArray = [[NSMutableArray alloc] init];

Кому:

NSMutableArray *buildingFeedArray = [[NSMutableArray alloc] init];


Вы должны освободить объекты как можно скорее, поэтому в опубликованном вами коде вы не использовали jsonString после синтаксического анализа, поэтому вы должны выпустить его сразу после.


Также вы можете упростить код, заменив:

SBJsonParser *parser = [[[SBJsonParser alloc] init] autorelease];
NSString *jsonString = [[NSString alloc] initWithData:[request responseData] encoding:NSUTF8StringEncoding];
id response = [parser objectWithString:jsonString error:NULL]; //100.0% memory leak
NSMutableDictionary *peopleDictionary = (NSMutableDictionary *)response;

С:

NSString *jsonString = [[NSString alloc] initWithData:[request responseData] encoding:NSUTF8StringEncoding];
NSDictionary *peopleDictionary = (NSDictionary *)[jsonString JSONValue];

JSONValue - это удобный метод, добавленный в NSString с помощью инфраструктуры SBJSON,

И вы не изменили peopleDictionary в своем коде, поэтому он не должен быть изменяемым.
Кроме того, среда SBJSON, независимо от того, используете ли вы метод удобства или нет, не возвращает изменяемые объекты, поэтому, если бы вы попытались использовать метод изменяемого класса, компилятор не предупредил бы вас, но приложение зависло бы, когда вы достигли Это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...