iPhone - 使用SBJsonParser的Objective-C内存泄漏

时间:2011-02-13 09:58:18

标签: iphone objective-c json memory-leaks autorelease

我使用Xcode中的“Leaks”工具继续获得以下内存泄漏。由于这是一个库,我只是想知道什么是解决这种泄漏的最佳方法。任何帮助将不胜感激。如果需要,我很乐意分享更多代码。

更新:我发现这篇文章似乎并不乐观。有没有人对如何解决这个问题有任何建议?

http://code.google.com/p/json-framework/issues/detail?id=13

enter image description here

这就是我使用图书馆的方式。

- (void)getFacebookProfileFinished:(ASIHTTPRequest *)request {
    NSString *responseString = [request responseString];
    NSMutableDictionary *responseJSON = [responseString JSONValue]; //memory leak 100%   

    NSString *username;
    NSString *firstName = [responseJSON objectForKey:@"first_name"];
    NSString *lastName = [responseJSON objectForKey:@"last_name"];
    NSString *facebookId = [responseJSON objectForKey:@"id"];
    if (firstName && lastName) {
        username = [NSString stringWithFormat:@"%@ %@", firstName, lastName];
    } else {
        username = @"";
    }

    UIAppDelegate.userSessionId = facebookId;
    UIAppDelegate.userFullName = username;

    if (UIAppDelegate.userSessionId != nil) {
        Service1 *service = [[Service1 alloc] init];
        [service UserExists:self action:@selector(handlerUserExists:) facebookUserId:UIAppDelegate.userSessionId];
        [service release];
    } else {
        [Utility displayAlertMessage:@"There has been an error. Please try again later." withTitle:@"Error"];
        [self logoutCompletely];
    }
}

2 个答案:

答案 0 :(得分:6)

通过评论你的if(第50行)的正文,你已经让你的释放(第51行)有条件。注释掉if(第49行)。

但是,说过你以前的方法有同样的问题,但显然没有警告,或者它从未使用过?

答案 1 :(得分:2)

正如CRD上面所说的那样。您的JSONFragmentValue中存在相同的泄漏。这是一个正确的非泄漏版本。

- (id) JSONFragmentValue
{
    SBJasonParser *jsonParser = [SBJasonParser new];
    id repr = [jsonParser fragmentWithString:self];
    if (repr == nil)
    {
        NSLog(@"JSonFragmentValue failed:%@", [jsonParser ErrorTrace]);
    }
    [jsonparser release], jsonParser = nil;
    return repr;
}

或者如果您更喜欢自动释放池。

- (id) JSONFragmentValue
    {
        SBJasonParser *jsonParser = [SBJasonParser new] autorelease];
        id repr = [jsonParser fragmentWithString:self];
        if (repr == nil)
        {
            NSLog(@"JSonFragmentValue failed:%@", [jsonParser ErrorTrace]);
        }
        return repr;
    }