В ARC продолжайте получать EXC_BAD_ACCESS после использования ARC из-за использования Block?

Проблема: я продолжаю получать EXC_BAD_ACCESS. И после того, как я открыл NSZombieEnabled, я увидел это [FeatureCommentListViewController responsesToSelector:]: сообщение, отправленное на освобожденный экземпляр 0x7c1dc30

  1. До того, как я сменил свой проект на ARC, такой ошибки не было, но после того, как я перешел на ARC, эта ошибка появилась.

  2. Я объявляю ViewController в блоке и помещаю его в контроллер навигации. Будет ли по этой причине его жизнь короче?

    UIBlockButton взят из этот пост

    UIBlockButton *lbGood3 = [[UIBlockButton alloc] initWithFrame:CGRectMake(0, 0, First_Button_Width, [self getGoodRow2Height:productDetail]) ];
    [lbGood3 handleControlEvent:UIControlEventTouchUpInside withBlock:^ { 
    NSLog(@"%@", Label.text); 
    
    ProductDetail *productDetail = [productDetailDict objectForKey:@"product"];
    NSString *dp_id = [NSString stringWithFormat:@"%@-%@",productDetail.url_crc,productDetail.site_id];
    
    
    FeatureCommentListViewController *cmtListController = [[FeatureCommentListViewController alloc] initWithNibName:@"FeatureCommentListViewController" bundle:nil];
    cmtListController.title = Label.text;
    cmtListController.isReviewed=isReviewed;
    cmtListController.productDetail=productDetail;
    cmtListController.dp_id=dp_id;
    cmtListController.feature_name = @"&feature_good_id=2";
    
    [self.navigationController pushViewController:cmtListController animated:YES];
    
    }];
    

Должен ли я объявить контроллер как член этого viewController или просто объявить вне блока?


person jeswang    schedule 12.07.2012    source источник
comment
откуда вы взяли EXC_BAD_ACCESS?   -  person lu yuan    schedule 12.07.2012
comment
Мне интересно, зачем нажимать контроллер представления в блоке, а не в основном потоке? Разве не важно дать быстрый отклик на сенсорное действие? пс. Если вы объявите vc вне блока, вы можете добавить перед ним __block, как упоминал Герман Клекер.   -  person lu yuan    schedule 12.07.2012
comment
У вас есть трассировка стека? Возникает ли EXC_BAD_ACCESS внутри блока или после нажатия контроллера? Ваш навигационный контроллер должен сохранять cmtListController, когда вы нажимаете его, а ARC должен добавлять [cmtListController release] в конце блока после последнего обращения к cmtListController.   -  person Christopher Pickslay    schedule 12.07.2012
comment
@ChristopherPickslay на самом деле нет. Потому что EXC_BAC_ACCESS произошел в функции обратного вызова сетевого запроса. Но я могу получить класс выпущенного объекта (FeatureCommentListViewController). Я решил это, выделив FeatureCommentListViewController в функции viewDidLoad и используя его в блоке.   -  person jeswang    schedule 13.07.2012


Ответы (2)


Я решил это, выделив FeatureCommentListViewController в функции viewDidLoad и используя его в блоке.

person jeswang    schedule 16.07.2012

1-й. Мне интересно, почему вы нажимаете контроллер представления в блоке, но не в основном потоке? Разве не важно дать быстрый отклик на сенсорное действие?

Второй.[self.navigationController pushViewController:cmtListController animated:YES]; находится в вашем блоке. Всякий раз, когда вы покидаете текущий navigationController, что будет представлять self.navigationController?

3-й. Если вы объявите viewController вне блока, вы можете добавить __block перед ним, как упоминал Герман Клекер.

person lu yuan    schedule 12.07.2012
comment
Все это не имеет значения: 1) блок выполняется в основном потоке (см. его связанный пост), 2) self является сохраненной ссылкой на текущий контроллер представления. как у него будет другой навигационный контроллер, пока отображается эта кнопка? и 3) использование __block позволит ему изменить указатель, определенный вне блока, но в этом нет необходимости - он создает новый дочерний контроллер, когда кнопка прослушивается. - person Christopher Pickslay; 12.07.2012
comment
@ChristopherPickslay Спасибо за исправление. Но если блок выполняется в основном потоке, почему мы используем блок здесь? - person lu yuan; 13.07.2012
comment
Я думаю, что смысл его UIBlockButton в том, что вы можете определить действие кнопки на месте, а не указывать ее на цель/действие. Это здорово, когда вам нужно создать много динамических кнопок. В его случае он настраивает контроллер с данными, относящимися к ячейке, в которой находится кнопка. Это возможно с целью/действием, но требует некоторой гимнастики. - person Christopher Pickslay; 13.07.2012