iPhone - Утечка памяти Objective-C с SBJsonParser - PullRequest
1 голос
/ 13 февраля 2011

Я продолжаю получать следующую утечку памяти, используя инструмент "Утечки" в XCode. Поскольку это библиотека, мне просто интересно, что было бы лучшим способом исправить такую ​​утечку. Любая помощь будет принята с благодарностью. Я рад поделиться больше кода, если это необходимо.

ОБНОВЛЕНИЕ: я нашел эту статью, которая не кажется многообещающей. Кто-нибудь получил какие-либо предложения относительно того, как это исправить?

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 ]

6 голосов
/ 13 февраля 2011

Комментируя тело вашего if (строка 50), вы сделали свой выпуск (строка 51) условным.Также закомментируйте if (строка 49).

Однако, сказав, что ваш предыдущий метод имеет ту же проблему, но, по-видимому, не предупрежден, или, возможно, он никогда не использовался?

2 голосов
/ 13 февраля 2011

Как сказано выше в 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;
    }
...