Заполните табличное представление с помощью UISearchDisplayController приводит к EXC_BAD_ACESS! ЗАЧЕМ? - PullRequest
0 голосов
/ 11 февраля 2012

Я провел некоторый тест с UISearchDisplayController и обнаружил странное поведение, которое не могу объяснить должным образом.Пожалуйста, взгляните на следующий код:

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {    
    return numOfRecords;
}

- (NSArray*) search:(NSString*)query {
    // Prepare URL request to download statuses from Twitter
    NSString *urlString = [NSString stringWithFormat:@"http://someaddress/search.ac?term=%@", query];
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:urlString]];

    // Perform request and get JSON back as a NSData object
    NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];

    // Get JSON as a NSString from NSData response
    NSString *json_string = [[NSString alloc] initWithData:response encoding:NSUTF8StringEncoding];


    NSArray *parsedResult = [json_string JSONValue];
    return parsedResult;
}

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *kCellID = @"cellID";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kCellID];
    if (cell == nil)
    {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:kCellID] autorelease];
        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    }

    int i = [indexPath row];
    if ( i >= [searchResult count] ) return cell;


    NSString *res = [searchResult objectAtIndex:i];
    [[cell textLabel] setText:res];

    return cell;
}

- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString {

    // WEB Request
    NSArray *entries = [self search:searchString];

    numOfRecords = [entries count];

    NSMutableArray *entryTitles = [[NSMutableArray alloc] init];

    for (int i=0; i<numOfRecords; i++) {
        NSDictionary *entry = [entries objectAtIndex:i];
        [entryTitles addObject:[entry objectForKey:@"title"]];
    }

    searchResult = entryTitles;

    return YES;
}

Переменная searchResult является переменной-членом типа NSArray.Этот код работает нормально, однако, если я изменю присвоение searchResult на

searchResult = [NSArray arrayWithArray: entryTitles];

Программа вылетает после ввода второй буквы в поле поиска с помощью EXC_BAD_ACCESS.

Может кто-нибудь объяснить, чтопроблема, которая вызывает эту ошибку?

Ответы [ 3 ]

0 голосов
/ 11 февраля 2012
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString {

    // WEB Request
    NSArray *entries = [self search:searchString];
    [searchResult autorelease];
    searchResult = [[entries valueForKeyPath:"@unionOfObjects.title"] retain];

    return YES;
}
0 голосов
/ 22 февраля 2012

Я столкнулся с той же проблемой. Моя проблема заключалась в том, что в cellForRowAtIndexPath я освобождаю объект в массиве результатов поиска после загрузки строкового значения в ячейку для отображения.

Следовательно, когда я пытался что-то искать, оно сразу вылетало.

Убедитесь, что вы не отпускаете объекты, по которым вы ищете.

0 голосов
/ 11 февраля 2012

Вам, вероятно, просто нужно сохранить его:

searchResult = [[NSArray arrayWithArray: entryTitles] retain];

Вам нужно сделать это, потому что arrayWithArray просто создает автоматически выпущенный объект, который будет выпущен в ближайшем будущем. Вы должны добавить свое удержание, чтобы стать владельцем.

Как только вы приобрели право собственности, не забудьте выпустить его где-нибудь.

...