【问题标题】:Under ARC, keep getting EXC_BAD_ACCESS after using ARC, because of using Block?在ARC下,使用ARC后不断获取EXC_BAD_ACCESS,是因为使用了Block?
【发布时间】:2018-02-26 17:33:55
【问题描述】:

问题: 我不断收到 EXC_BAD_ACCESS。在我打开 NSZombieEnabled 后,我看到了这个 [FeatureCommentListViewController respondsToSelector:]: message sent to deallocated instance 0x7c1dc30

  1. 在我将项目改成ARC之前没有这个错误,但是我改成ARC之后就出现了这个错误。

  2. 我在 Block 中声明了一个 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];
    
    }];
    

我应该将控制器声明为这个 viewController 的成员还是直接声明出来?

【问题讨论】:

  • 您从哪里获得 EXC_BAD_ACCESS?
  • 我想知道为什么将视图控制器推送到块中而不是主线程中?对触摸动作做出快速响应不是很重要吗?附言。如果您将 vc 声明为块外,则可以在其前面添加 __block,如 Hermann Klecker 所述。
  • 你有堆栈跟踪吗? EXC_BAD_ACCESS 是在块内发生还是在控制器被推后发生?当你推送它时,你的导航控制器应该保留cmtListController,并且ARC应该在最后一次访问cmtListController之后在块的末尾添加一个[cmtListController release]
  • @ChristopherPickslay 实际上没有。因为 EXC_BAC_ACCESS 发生在网络请求的回调函数中。但我可以得到释放对象的类(FeatureCommentListViewController)。我通过在 viewDidLoad 函数中分配 FeatureCommentListViewController 并在块中使用它来解决这个问题。

标签: ios objective-c-blocks


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    第一。我想知道为什么要将视图控制器推送到块中而不是主线程中?对触摸动作做出快速响应不是很重要吗?

    2nd.[self.navigationController pushViewController:cmtListController animated:YES]; 在你的街区。每当您离开当前的navigationController 时,self.navigationController 将代表什么?

    第三。如果您将 viewController 声明为块外,您可以在其前面添加 __block,如 Hermann Klecker 所述。

    【讨论】:

    • 所有这些都无关紧要--1) 块在主线程上执行(参见他的链接帖子),2) self 是对当前视图控制器的保留引用。显示此按钮时它如何具有不同的导航控制器? 3)使用__block 将允许他修改在块外定义的指针,但这不是必需的——他正在创建一个新的子控制器时点击一个按钮。
    • @ChristopherPickslay 感谢您的指正。但是如果block是在主线程上执行的,为什么我们这里要使用block呢?
    • 我认为他的UIBlockButton 的重点是您可以就地定义按钮的操作,而不是将其指向目标/操作。当您必须创建大量动态按钮时,这非常棒。在他的例子中,他使用特定于按钮所在单元格的数据配置控制器。目标/动作可以做到这一点,但需要一些体操。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多