在ARC下,使用ARC后继续获取EXC_BAD_ACCESS,因为使用了Block?

时间:2012-07-12 10:17:40

标签: ios objective-c-blocks

问题: 我一直在获得EXC_BAD_ACCESS。在我打开NSZombieEnabled后,我看到[FeatureCommentListViewController respondsToSelector:]:消息发送到解除分配的实例0x7c1dc30

  1. 在我将项目更改为ARC之前,没有此类错误,但在我更改为ARC后,出现此错误。

  2. 我在块中声明了一个ViewController并将其推入导航控制器。这个理由会不会缩短它的寿命?

    UIBlockButton来自this post

    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];
    
    }];
    
  3. 我应该将控制器声明为此viewController的成员还是只声明该块?

2 个答案:

答案 0 :(得分:0)

我通过在viewDidLoad函数中分配FeatureCommentListViewController并在块中使用它来解决这个问题。

答案 1 :(得分:-2)

<强>第一即可。我想知道你为什么要在一个块中推送视图控制器而不是在主线程中?对触摸动作做出快速反应是不是很重要?

第二次[self.navigationController pushViewController:cmtListController animated:YES];在你的区块中。只要您离开当前navigationControllerself.navigationController代表的是什么?

<强>第三即可。如果您在块中声明viewController,则可以在Hermann Klecker提及的前面添加__block