Проблема UITableView и SearchBar - PullRequest
0 голосов
/ 01 мая 2010

Я пытаюсь добавить панель поиска в свой UITableView. Я следовал этому уроку: http://clingingtoideas.blogspot.com/2010/02/uitableview-how-to-part-2-search.html.

Я получаю эту ошибку, если наберу в поле поиска букву: Rooster(10787,0xa05ed4e0) malloc: *** error for object 0x3b5f160: double free *** set a breakpoint in malloc_error_break to debug.

Эта ошибка возникает здесь:

- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString {
    [self handleSearchForTerm:searchString];

    return YES;
}

(во второй строке)

- (void)handleSearchForTerm:(NSString *)searchTerm {
    [self setSavedSearchTerm:searchTerm];

    if ([self searchResults] == nil) {
        NSMutableArray *array = [[NSMutableArray alloc] init];
        [self setSearchResults:array];
        [array release];
    }

    //Empty the searchResults array
    [[self searchResults] removeAllObjects];

    //Check if the searchTerm doesn't equal zero...
    if ([[self savedSearchTerm] length] != 0) {
        //Search the whole tableList (datasource)
        for (NSString *currentString in tableList) {
            NSString *klasString = [[NSString alloc] init];
            NSInteger i = [[leerlingNaarKlasList objectAtIndex:[tableList indexOfObject:currentString]] integerValue];
            if(i != -1) {
                klasString = [klassenList objectAtIndex:(i - 1)];
            }

            //Check if the string matched or the klas (group of school)
            if ([currentString rangeOfString:searchTerm options:NSCaseInsensitiveSearch].location != NSNotFound ||
                [klasString rangeOfString:searchTerm options:NSCaseInsensitiveSearch].location != NSNotFound) {
                //Add to results
                [[self searchResults] addObject:currentString];

                //Save the klas (group of school). It has the same index as the result (lastname)
                NSString *strI = [[NSString alloc] initWithFormat:@"%i", i];
                [[self searchResultsLeerlingNaarKlas] addObject:strI];
                [strI release];
            }

            [klasString release];
        }
    }
}

Может кто-нибудь мне помочь?

С уважением, Dodo

1 Ответ

2 голосов
/ 01 мая 2010

Ошибка двойного освобождения означает, что вы выпустили объект больше, чем нужно. Здесь подозрительным объектом является klasString. Из вашего кода:

NSString *klasString = [[NSString alloc] init];
...
if(i != -1) {
    klasString = [klassenList objectAtIndex:(i - 1)];
}
...
[klasString release];

присваивание внутри оператора if

  1. теряет ссылку на вновь выделенную строку NSSt, что приводит к утечке памяти
  2. позволяет применить более позднюю версию к объекту из klassenList. Когда klassenList освобождает свои элементы, возникает ошибка двойного освобождения.
...