Под ARC продължавате да получавате EXC_BAD_ACCESS след използване на ARC, поради използването на Block?

Проблем: Продължавам да получавам EXC_BAD_ACCESS. И след като отворя NSZombieEnabled, видях това [FeatureCommentListViewController respondsToSelector:]: съобщение, изпратено до освободен екземпляр 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 пред него, както е споменато от Hermann Klecker.   -  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-ви. Чудя се защо натискате контролер за изглед в блок, но не и в основната нишка? Не е ли важно да реагирате бързо на действието с докосване?

2.[self.navigationController pushViewController:cmtListController animated:YES]; е във вашия блок. Всеки път, когато сте напуснали текущия navigationController, какво ще представлява self.navigationController?

3-ти. Ако декларирате viewController извън блока, можете да добавите __block пред него, както е споменато от Hermann Klecker.

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 е, че можете да дефинирате действието на бутона на място, вместо да го насочвате към цел/действие. Това е страхотно, когато трябва да създадете много динамични бутони. В неговия случай той конфигурира контролера с данни, специфични за клетката, в която се намира бутонът. Това е възможно с target/action, но е необходима известна гимнастика. - person Christopher Pickslay; 13.07.2012