目标 C 中选择器上的 EXC_BAD_ACCESS

Posted

技术标签:

【中文标题】目标 C 中选择器上的 EXC_BAD_ACCESS【英文标题】:EXC_BAD_ACCESS on selector in objective C 【发布时间】:2013-12-05 19:22:59 【问题描述】:

我有一个 UIBarButtonItem 类别,我在其中使用自定义 UIButtons 构建 UIBarButtonItems,因为我发现 UIButtons 比 UIBarButtonItems 更容易自定义。

现在,我想继续使用 BarButtonItem 的 target 和 action 属性,而不是使用按钮中的属性,以便 BarButtonItem 可以继续在外部自定义,而无需任何人知道实现细节(即,它是在内部使用按钮)。

现在,为了做到这一点,我在我的类别中编写了这段代码:

+ (UIBarButtonItem *)backBarButtonItemWithColor:(UIColor *)color 

    UIImage *closeIcon = [MyImageUtility navBarBackArrow];
    if (color) closeIcon = [closeIcon imageWithColorOverlay:color];

    UIButton *close = [[UIButton alloc] initWithFrame:CGRectMake(0.0f, 0.0f, closeIcon.size.width+10.0f, closeIcon.size.height+10.0f)];
    UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithCustomView:close];
    [close setImage:closeIcon forState:UIControlStateNormal];

    [close addTarget:item action:@selector(SD_executeBarButtonItemAction) forControlEvents:UIControlEventTouchUpInside];

    return item;



- (void)SD_executeBarButtonItemAction

    [self.target performSelector:self.action];

每当调用 SD_executeBarButtonItemAction 时,我都会在选择器上获得 exc_bad_access,但我不确定为什么。有任何想法吗?有没有办法解决这个问题?

谢谢!

编辑:

这是该选择器正在崩溃的调用代码:

void (^transition)(void) = ^(void) 
    [self.rightContainer  setFrame:[self offscreenContainerFrame]];
    [self.centerContainer setAlpha:1.0f]; //TODO: this is unreliable in ios6 -- we should add a view to the top of it to darken
    [self.centerContainer setTransform:CGAffineTransformIdentity];
;

[self notifyWillShowPrimaryViewController];

[self performBlock:transition animated:YES completion:^(BOOL finished) 
    [self notifyDidShowPrimaryViewController];
    [self setForegroundController:self.primaryNavigationController];
    if (block != NULL) block(finished);
];

【问题讨论】:

self.action 是什么? UIBarButtonItem的目标和动作在哪里设置? UIBarButtonItem的action属性 它们被设置为 [back setTarget:self];和 [返回 setAction:@selector(showPrimaryAction:)];其中 self 是一个 viewController 是否有可能在点击条形按钮时,条形按钮的目标已被释放? 【参考方案1】:

您的代码是递归调用。

- (void)SD_executeBarButtonItemAction

    [self.target performSelector:self.action];

你设置如下:

[close addTarget:item action:@selector(SD_executeBarButtonItemAction) forControlEvents:UIControlEventTouchUpInside];

其中itemUIBarButtonItem

【讨论】:

不要认为它是递归的——UIButton(关闭)调用 UIBarButtonItem 上的选择器。 @SeanDanzeiser:我不认为会发生这种情况,请设置断点并检查目标和操作是否正确 (lldb) po [self class] UIBarButtonItem (lldb) po self.target (lldb) po NSStringFromSelector(self.action) showPrimaryAction: -- 对我来说是正确的。 UIBarButtonItem 正在调用控制器上的 showPrimaryAction: 选择器,这在概念上是我想要发生的。我一定遗漏了一些明显的东西...... @SeanDanzeiser:该方法是否在 MLPhoneRootContainerViewController 中实现?可以贴一下方法声明吗? @SeanDanzeiser:我想我遇到了问题,但需要验证它是否正确。我认为这是您的选择器方法 (showPrimaryAction:) 实现的问题

以上是关于目标 C 中选择器上的 EXC_BAD_ACCESS的主要内容,如果未能解决你的问题,请参考以下文章

如何重新配置​​平面文件连接管理器上的列信息?

jQueryUI 日期选择器上的焦点事件

打开日期选择器上的今天按钮

网络选项卡未显示应用在选择器上的 css

覆盖链式选择器上的 Tailwind CSS @apply 指令

保存字段日期选择器上的 JqGrid 错误