утечка памяти при использовании JSONKit при повторном вызове - PullRequest
0 голосов
/ 01 июля 2011

Я прочитал документы Apple по управлению памятью и чувствую, что понимаю их, но не могу понять, что это не утечка.В этом примере у меня процесс запущен в главном потоке, чтобы упростить его.При первом нажатии кнопки поиска все работает нормально, утечек нет.При повторном поиске происходит щелчок / выполнение, все работает, но инструменты показывают следующие утечки:

Leaked Object   #   Address Size    Responsible Library Responsible Frame
NSCFString,42   < multiple >    1.30 KB CTContacts  jk_cachedObjects
NSCFString,16   < multiple >    464 Bytes   CTContacts  jk_cachedObjects
JKDictionary,7  < multiple >    224 Bytes   CTContacts  jk_object_for_token
Malloc 288 Bytes,7  < multiple >    1.97 KB CTContacts  jk_object_for_token
Malloc 32 Bytes,    0x7859a30   32 Bytes    CTContacts  jk_object_for_token
JKArray,    0x78599f0   32 Bytes    CTContacts  jk_object_for_token

кажется, что он указывает на эту строку: (указан как% 100)

NSDictionary *resultsDictionary = [jsonData objectFromJSONDataWithParseOptions:JKParseOptionStrict error:(NSError **)error];

Я попытался NSDictionary * resultsDictionary = [[[NSDictionary alloc] init] autorelease];но с тем же результатом.

Ниже приведены два метода:

- (void) searchBarSearchButtonClicked:(UISearchBar *)theSearchBar {    
pickerView.hidden=YES;
searchBar.showsScopeBar=YES;
[searchBar setShowsCancelButton:NO animated:YES];
[searchBar resignFirstResponder];

[self queryWebService];
}

-(void) queryWebService{

NSString *urlAddress = [NSString stringWithFormat:@"http://myweb.com/json.php?lname=%@&searchType=%@",searchBar.text,currentSearchCategory];

NSURL *url = [NSURL URLWithString:urlAddress];

ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setDelegate:self];
[request startSynchronous];
NSError *error = [request error];
if (!error){
    NSString *responseString = [request responseString];
    //NSLog(@"Response: %@", responseString);

    NSData *jsonData = [responseString dataUsingEncoding:NSUTF8StringEncoding];
    NSError *error = nil;

    NSDictionary *resultsDictionary = [jsonData objectFromJSONDataWithParseOptions:JKParseOptionStrict error:(NSError **)error];

    if (resultsDictionary)
    {
        rows = [[resultsDictionary objectForKey:@"contacts"] retain];
        resultsDictionary=nil;
    }
}        
[myTableView reloadData];
}

NSArray "строки" используется в качестве источника данных tableView.Любая помощь будет оценена, спасибо.

1 Ответ

3 голосов
/ 01 июля 2011

Я полагаю, что причиной является rows.Каждый раз, когда вы проходите через цикл, вы добавляете в него еще один retain.Избавление от retain должно сделать свое дело и избавиться от утечки памяти.Если по какой-то причине здесь требуется retain, вам просто нужно найти место в другом месте, чтобы освободить его и сохранить счет удержания на правильном значении

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