EXC_BAD_ACCESS, когда я прокручиваю свое представление - PullRequest
0 голосов
/ 10 февраля 2012

У меня есть два представления: первое - это UITableView в простом стиле (создано программно);второй - UIScrollView, который содержит изображение и UITableView в сгруппированном стиле (также создан программно).

Когда я перехожу из firstView -> secondView, все работает нормально.Однако, если я возвращаюсь к firstView и затем пытаюсь перейти к firstView -> secondView во второй раз, я получаю ошибку EXC_BAD_ACCESS.

UPDATE

Это код UITableView делегата в secondView:

-
 (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

    switch (section) {
        case 0: 

        //header - breve descrizione
        return 2;

        break;
    case 1: //mappa

        //header - mappa statica (immagine) - footer (indirizzo)
        return 3;

        break;
    case 2: //review

        //header - prima review
        return 2;

        break;
    default:
        return 0;

        break;


 }

}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {

    switch (indexPath.section) {
        case 0:
            switch (indexPath.row) {
                case 0: //case titolo (header)


    return HTABLE_DESCR_HEADER;
                    break;

                case 1: //case corpo
                    return HTABLE_DESCR_BODY;
                    break;

                default:
                    return 0;
                    break;
            }
            break;
        case 1:

            switch (indexPath.row) {
                case 0: //case titolo (header)
                    return HTABLE_LOC_HEADER;
                    break;

                case 1: //case corpo
                    return HTABLE_LOC_BODY;
                    break;

                case 2: //case footer 
                    return HTABLE_LOC_FOOTER;
                    break;

                default:
                    return 0;
                    break;
            }

            break;
        case 2:

            switch (indexPath.row) {
                case 0: //case titolo (header)
                    return HTABLE_REV_HEADER;
                    break;

                case 1: //case corpo
                    return HTABLE_REV_BODY;
                    break;

                default:
                    return 0;
                    break;
            }

            break;
        default:            
            return 0;
            break;
    }

}

/*- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {

 return @"Travellers Guide";

 }*/

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    int section = 2;

    //se ci sono review
    if ([[[[SingletonCardPOI sharedCardPOI] dicCard] objectForKey:@"list_review"] count] > 0) {
        section++;
    }

    return section;

}

// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) {
        cell = [self getCellContentView:CellIdentifier];
    }    

    cell.accessoryType = UITableViewCellAccessoryNone;

    cell.selectionStyle = UITableViewCellSelectionStyleGray;

    switch (indexPath.section) {
        case 0: //descrizione

            switch (indexPath.row) {
                case 0: //header

                    if ([[[NSUserDefaults standardUserDefaults] objectForKey:@"language"] isEqualToString:@"it"]) {
                        cell.textLabel.text = @"Descrizione";
                    } else {
                        cell.textLabel.text = @"Description";
                    }
                    cell.textLabel.backgroundColor = [UIColor clearColor];
                    cell.textLabel.textColor = [UIColor blackColor];
                    cell.textLabel.shadowColor = [UIColor whiteColor];
                    cell.textLabel.shadowOffset = CGSizeMake(1, 1);
                    cell.textLabel.highlightedTextColor = [UIColor blackColor];
                    cell.textLabel.font = [UIFont boldSystemFontOfSize:11.0];
                    cell.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"rigaDescrHeader.png"]];

                    break;

                case 1: //descrizione

                    NSLog(@"Descr");

                    cell.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"rigaRevBody.png"]];
                    cell.textLabel.text = [[[SingletonCardPOI sharedCardPOI] dicCard] objectForKey:@"description"];
                    cell.textLabel.font = [UIFont systemFontOfSize:10.0];
                    cell.textLabel.lineBreakMode = UILineBreakModeTailTruncation;
                    cell.textLabel.numberOfLines = 3;
                    cell.textLabel.textColor = [UIColor blackColor];
                    cell.textLabel.backgroundColor = [UIColor clearColor];
                    cell.textLabel.shadowColor = [UIColor whiteColor];
                    cell.textLabel.shadowOffset =CGSizeMake(1, 1);
                    cell.textLabel.highlightedTextColor = [UIColor blackColor];

                    break;

                default:
                    break;
            }

            break;
        case 1: //mappa

            //header - mappa statica (immagine) - footer (indirizzo)
            switch (indexPath.row) {
                case 0: //header

                    if ([[[NSUserDefaults standardUserDefaults] objectForKey:@"language"] isEqualToString:@"it"]) {
                        cell.textLabel.text = @"Posizione";
                    } else {
                        cell.textLabel.text = @"Location";
                    }
                    cell.textLabel.font = [UIFont boldSystemFontOfSize:11.0];
                    cell.textLabel.backgroundColor = [UIColor clearColor];
                    cell.textLabel.textColor = [UIColor blackColor];
                    cell.textLabel.shadowColor = [UIColor whiteColor];
                    cell.textLabel.shadowOffset = CGSizeMake(1, 1);
                    cell.textLabel.highlightedTextColor = [UIColor blackColor];
                    cell.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"rigaLocHeader.png"]];

                    break;

                case 1: //mappa

                    NSLog(@"Mappa");

                    CLLocationDegrees latitude  = [[[[SingletonCardPOI sharedCardPOI] dicCard] objectForKey:@"latitude"] doubleValue];
                    CLLocationDegrees longitude = [[[[SingletonCardPOI sharedCardPOI] dicCard] objectForKey:@"longitude"] doubleValue];
                    CLLocation* poiLocation = [[[CLLocation alloc] initWithLatitude:latitude longitude:longitude] autorelease];
                    Annotation *ann = [Annotation annotationWithCoordinate:poiLocation.coordinate];
                    //mapView = [[MKMapView alloc] initWithFrame:CGRectMake(0, 0, 320, HTABLE_LOC_BODY)];
                    [mapView setHidden:NO];
                    [mapView addAnnotation:ann];
                    MKCoordinateRegion region = {{0.0f, 0.0f}, {0.0f, 0.0f}};
                    region.center = poiLocation.coordinate;                    
                    region.span.longitudeDelta = 0.05f;
                    region.span.latitudeDelta  = 0.05f;
                    [self.mapView setRegion:region animated:YES];
                    [self.mapView regionThatFits:region];
                    cell.backgroundView = mapView;


                    UIImageView *imgView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 302, 120)]; 
                    imgView.image = [UIImage imageNamed:@"ombraMappa.png"];
                    [cell.backgroundView addSubview:imgView];
                    [imgView release];

                    break;

                case 2: //footer

                    cell.textLabel.text = [[[SingletonCardPOI sharedCardPOI] dicCard] objectForKey:@"locality"];
                    cell.textLabel.font =[UIFont systemFontOfSize:10.0];
                    cell.textLabel.backgroundColor = [UIColor clearColor];
                    cell.textLabel.textColor = [UIColor blackColor];
                    cell.textLabel.shadowColor = [UIColor whiteColor];
                    cell.textLabel.shadowOffset = CGSizeMake(1, 1);
                    cell.textLabel.highlightedTextColor = [UIColor blackColor];

                    cell.detailTextLabel.text = [[[SingletonCardPOI sharedCardPOI] dicCard] objectForKey:@"address"];
                    cell.detailTextLabel.font = [UIFont boldSystemFontOfSize:9.0];
                    cell.detailTextLabel.textColor = [UIColor grayColor];
                    cell.detailTextLabel.backgroundColor = [UIColor clearColor];
                    cell.detailTextLabel.shadowColor = [UIColor whiteColor];
                    cell.detailTextLabel.shadowOffset = CGSizeMake(1, 1);
                    cell.detailTextLabel.highlightedTextColor = [UIColor blackColor];
                    cell.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"rigaLocFooter.png"]];

                    break;

                default:
                    break;
            }

            break;
        case 2: //review

            //header - mappa statica (immagine) - footer (indirizzo)
            switch (indexPath.row) {
                case 0: //header

                    if ([[[NSUserDefaults standardUserDefaults] objectForKey:@"language"] isEqualToString:@"it"]) {
                        cell.textLabel.text = [NSString stringWithFormat:@"Recensioni (%d)",[[[[SingletonCardPOI sharedCardPOI] dicCard] objectForKey:@"list_review"] count]];
                    } else {
                        cell.textLabel.text = [NSString stringWithFormat:@"Review (%d)",[[[[SingletonCardPOI sharedCardPOI] dicCard] objectForKey:@"list_review"] count]];
                    }
                    cell.textLabel.font = [UIFont boldSystemFontOfSize:11.0];
                    cell.textLabel.backgroundColor = [UIColor clearColor];
                    cell.textLabel.textColor = [UIColor blackColor];
                    cell.textLabel.shadowColor = [UIColor whiteColor];
                    cell.textLabel.shadowOffset = CGSizeMake(1, 1);
                    cell.textLabel.highlightedTextColor = [UIColor blackColor];

                    cell.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"rigaLocHeader.png"]];

                    break;

                case 1: //review

                    cell.textLabel.text = [[[[[SingletonCardPOI sharedCardPOI] dicCard] objectForKey:@"list_review"] objectAtIndex:0] objectForKey:@"review"];
                    cell.textLabel.font =[UIFont systemFontOfSize:10.0];
                    cell.textLabel.lineBreakMode = UILineBreakModeTailTruncation;
                    cell.textLabel.numberOfLines = 3;
                    cell.textLabel.backgroundColor = [UIColor clearColor];
                    cell.textLabel.textColor = [UIColor blackColor];
                    cell.textLabel.shadowColor = [UIColor whiteColor];
                    cell.textLabel.shadowOffset = CGSizeMake(1, 1);
                    cell.textLabel.highlightedTextColor = [UIColor blackColor];
                    cell.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"rigaRevBody.png"]];

                    break;

                default:
                    break;
            }

            break;
        default:                
            break;
    }

    return cell;

}


- (UITableViewCell *) getCellContentView:(NSString *)cellIdentifier {

    UITableViewCell *cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier] autorelease];

    return cell;
}

Ответы [ 2 ]

1 голос
/ 03 июня 2012

Я только что провел неделю, выискивая проблему EXC_BAD_ACCESS в большом приложении, которое работало нормально, прежде чем преобразовать его в ARC. Я бы получил EXC_BAD_ACCESS на закрывающей скобке конструкции "switch". Тем не менее, NSZombieEnabled и различные настройки инструмента ничего для меня не обнаружат.

Что исправило, так это наложение кудрей вокруг дела, которое имело значение. Я сделал это для каждого из них, хотя, возможно, это было критично только для некоторых, то есть

До:

case ...:
 stmt;
 stmt;
 break;

После того, как:

case ...:{
 stmt;
 stmt;
 }break;

Это решило проблему в двух местах в большом приложении для меня. Я знаю, что где-то читал о ARC и switch / case (и, возможно, кто-то может добавить ссылку на него), но я не понимаю теорию, почему это произошло и почему это исправление сработало. Возможно, кто-то мог объяснить. (Позже: после прочтения следующей ссылки в openradar, все это имеет смысл - что-то не так в "коде очистки", сгенерированном между инструкциями case - генерируется поддельный "релиз", который вскоре вызывает EXC_BAD_ACCESS .)

Я также обнаружил, что это может быть связано: http://openradar.appspot.com/11329693

1 голос
/ 14 февраля 2012

EXC_BAD_ACCESS не вызвано переходом одного вида к другому. Скорее, виноваты будут свойства этих представлений или создание и освобождение - или не - самих объектов представлений.

Ваш первый шаг - запустить Анализатор. Затем, если вы исправили все это, и проблема все еще остается, запустите инструмент Leaks в Инструментах.

Для получения более подробной информации о решении EXC_BAD_ACCESS проблем, а также отличной ссылки на причины этих ошибок и пошаговых инструкций по их устранению, посмотрите ответы на эти вопросы:

поиск причины для EXC_BAD_ACCESS - в Xcode4

Случайный EXC_BAD_ACCESS в месте, где это не может произойти

В вашем случае я бы специально посмотрел, как вы создаете secondView, и что вы делаете с firstView, когда возвращаетесь к secondView.

...