调用按钮操作时的 EXC_BAD_ACCESS(代码 = 2 或代码 1)

Posted

技术标签:

【中文标题】调用按钮操作时的 EXC_BAD_ACCESS(代码 = 2 或代码 1)【英文标题】:EXC_BAD_ACCESS (code=2 or code 1) when call button action 【发布时间】:2013-06-05 22:48:33 【问题描述】:

我正在使用iCarousel Library,但遇到了一些问题。

在控件演示示例项目中,使用了 XIB 文件,视图设置如下:

- (UIView *)carousel:(iCarousel *)carousel viewForItemAtIndex:(NSUInteger)index reusingView:(UIView *)view

    if (!view)
    
        //load new item view instance from nib
        //control events are bound to view controller in nib file
        //note that it is only safe to use the reusingView if we return the same nib for each
        //item view, if different items have different contents, ignore the reusingView value
        view = [[[NSBundle mainBundle] loadNibNamed:@"ItemView" owner:self options:nil] lastObject];
    
    return view;

因为我使用的是 Storyboard,所以我创建了一个视图控制器并像这样设置视图:

- (UIView *)carousel:(iCarousel *)carousel viewForItemAtIndex:(NSUInteger)index reusingView:(UIView *)view


    NSString * storyboardName = @"MainStoryboard";
    NSString * viewControllerID = @"DuuinNewsItem";
    UIStoryboard * storyboard = [UIStoryboard storyboardWithName:storyboardName bundle:nil];

    //create new view if no view is available for recycling
    if (!view)
    
        DUDuuin *tDuuin = [_duuins objectAtIndex:index];
        DUNewsItemViewController * controller = (DUNewsItemViewController *)[storyboard instantiateViewControllerWithIdentifier:viewControllerID];
        controller.duuin =  tDuuin;
        view = controller.view;
        [view setFrame:CGRectMake(0, 0, 314.0f, 415.0f)];

    

    return view;

当我向视图中的任何按钮添加操作时,我会收到错误消息:

我尝试了很多 *** 中推荐的东西,但我找不到解决方案:

我试过了:

将出口设置为强(有人说这是一个问题,因为 ARC) 在操作中删除发件人 在 View Controller 中添加具有 icarousel 的方法

****更新****

现在我看到了其他问题。当我在 DUNewsItemViewController 中定义 Action 并在模拟器中尝试时,它说:

-[__NSCFType btnTest:]: unrecognized selector sent to instance 0x1577c650

所以,我在 View Controller 的 .m 文件中添加了具有 iCarousel 的方法,问题仍然相同:

EXC_BAD_ACCESS (code=2)

一些信息:

我正在使用 ARC 故事板上有 观看次数是动态的

【问题讨论】:

你设置的强势出口是什么? iCarouselDUNewsItemViewControllerView 的插座? 按钮@Firo的出口 【参考方案1】:

您的主要问题不是具体的视图,而是您的 DUNewsItemViewController 实例。您在提供的方法中创建控制器并返回视图。该视图由iCarousel 保留。另一方面,您的 DUNewsItemViewController 不是。没有什么强烈指向它。由于没有指向它的强指针,它正在被释放。您的视图与所有按钮都正确显示,因为它再次保留在您的DUNewsItemViewController 之外。当按下按钮时,它会尝试访问其操作方法并失败,因为控制器不再存在。

要解决此问题,您需要创建一个指向控制器的强指针(而不是您之前尝试的按钮)。我不推荐一种完美的策略,而是一种有效的策略。

您可以创建一个可变数组(作为属性)并在创建视图控制器时将它们添加到其中(如果有多个)。这样iCarousel 的委托/数据源的控制器就持有对它的引用:

if (!view)

    DUDuuin *tDuuin = [_duuins objectAtIndex:index];
    DUNewsItemViewController * controller = (DUNewsItemViewController *)[storyboard instantiateViewControllerWithIdentifier:viewControllerID];
    // Add controller to array to hold a strong reference to it.
    [self.myMutableArray addObject:controller];
    //
    controller.duuin =  tDuuin;
    view = controller.view;
    [view setFrame:CGRectMake(0, 0, 314.0f, 415.0f)];


否则,如果只有一个(或几个),您可以创建独特的网点:

@property (strong, nonatomic) DUNewsItemViewController *firstVC; 

并在您的 carousel:viewForItemAtIndex:reusingView:view 方法中包含一行 self.firstVC = controller

如果有什么不明白的,请告诉我。同样,可能有更好的实现,但这应该可行。 XIB 在示例中起作用的原因是因为它们只是 UIViews 而不是像您使用的 UIViewController 子类。同样,您的视图正常工作(显示,就像示例一样),但是您的控制器正在被释放(不像示例,因为没有使用控制器)。

【讨论】:

哇,谢谢,这很有意义!让我试试,我会告诉你它是否有效! @Firo 它不起作用兄弟,我在 te .m 文件中声明了一个属性@property (nonatomic, strong) NSMutableArray *views;,我添加了对象,但问题是一样的。 我更新了问题 @Firo 不要将视图添加到数组中。添加视图控制器。 (我假设您刚刚添加了视图,因为您的数组称为 views 我将 ViewControllers 添加到数组中,我在 carousel:viewForItemAtIndex:reusingView:view 中调用视图,因为它返回一个视图,兄弟有什么想法吗? @Firo 我更新了我的答案,看看这是否是您将控制器添加到阵列的方式。

以上是关于调用按钮操作时的 EXC_BAD_ACCESS(代码 = 2 或代码 1)的主要内容,如果未能解决你的问题,请参考以下文章

iPhone 模拟器启动时的 EXC_BAD_ACCESS。应用程序在设备上运行

启动 AVAudioPlayer 时的 EXC_BAD_ACCESS

使用异步请求时的 exc_bad_access

执行 segue 时的 EXC_BAD_ACCESS(code 1, address=0x1)

拖动 UIScrollView 时的 EXC_BAD_ACCESS

更改 nsdictionary 中的布尔值时的 EXC_BAD_ACCESS