繁体   English   中英

SBJSON分析器内存泄漏

[英]SBJSON Parser Memory Leak

我正在尝试使用SBJSON解析JSON提要,但是每次通过仪器运行它时,我都会在一行上发生100%的内存泄漏。 我肯定有一些不正确的地方,并希望获得一些见识。

我有一个Towns的表格视图,当您单击一个城镇时,此提要将运行并获取一个居住在该城镇中的人的列表,并在表格视图中对其进行解析。 但是,每次我将详细信息视图弹出到城镇列表并进入新的详细信息视图时,都会导致内存泄漏

 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];

您已经创建了一个名为buildingArray的NSArray,但随后将对象添加到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是SBJSON框架添加到NSString的便捷方法,

而且您还没有在代码中修改peopleDictionary,因此它不需要可变。
同样,无论您是否使用便捷方法,SBJSON框架都不会返回可变对象,因此,如果您尝试使用可变类的方法,则编译器不会警告您,但是当您到达时,应用程序将崩溃它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM