Ios 当使用关闭按钮时,objc_msgSend EXC_BAD_访问
在我的项目中,我在右上角添加了一个关闭按钮,如下所示:Ios 当使用关闭按钮时,objc_msgSend EXC_BAD_访问,ios,objective-c,xcode,uiview,uibutton,Ios,Objective C,Xcode,Uiview,Uibutton,在我的项目中,我在右上角添加了一个关闭按钮,如下所示: int closeBtnOffset = 10; UIImage* closeBtnImg = [UIImage imageNamed:@"popupCloseBtn.png"]; UIButton* closeBtn = [UIButton buttonWithType:UIButtonTypeCustom]; [closeBtn setImage:closeBtnImg forState:UIControlStateNormal]; [
int closeBtnOffset = 10;
UIImage* closeBtnImg = [UIImage imageNamed:@"popupCloseBtn.png"];
UIButton* closeBtn = [UIButton buttonWithType:UIButtonTypeCustom];
[closeBtn setImage:closeBtnImg forState:UIControlStateNormal];
[closeBtn setFrame:CGRectMake( background.frame.origin.x + background.frame.size.width - closeBtnImg.size.width - closeBtnOffset,
background.frame.origin.y ,
closeBtnImg.size.width + closeBtnOffset,
closeBtnImg.size.height + closeBtnOffset)];
[closeBtn addTarget:self action:@selector(closePopupWindow) forControlEvents:UIControlEventTouchUpInside];
[bigPanelView addSubview: closeBtn];
-(void)closePopupWindow
{
//remove the shade
[[bigPanelView viewWithTag: kShadeViewTag] removeFromSuperview];
[self performSelector:@selector(closePopupWindowAnimate) withObject:nil afterDelay:0.1];
}
closePopupWindw方法如下所示:
int closeBtnOffset = 10;
UIImage* closeBtnImg = [UIImage imageNamed:@"popupCloseBtn.png"];
UIButton* closeBtn = [UIButton buttonWithType:UIButtonTypeCustom];
[closeBtn setImage:closeBtnImg forState:UIControlStateNormal];
[closeBtn setFrame:CGRectMake( background.frame.origin.x + background.frame.size.width - closeBtnImg.size.width - closeBtnOffset,
background.frame.origin.y ,
closeBtnImg.size.width + closeBtnOffset,
closeBtnImg.size.height + closeBtnOffset)];
[closeBtn addTarget:self action:@selector(closePopupWindow) forControlEvents:UIControlEventTouchUpInside];
[bigPanelView addSubview: closeBtn];
-(void)closePopupWindow
{
//remove the shade
[[bigPanelView viewWithTag: kShadeViewTag] removeFromSuperview];
[self performSelector:@selector(closePopupWindowAnimate) withObject:nil afterDelay:0.1];
}
生成成功,但当我单击closeBtn按钮时,程序将关闭,并显示以下消息:
我认为代码没有问题,因为我从另一个项目复制了它,并且在那里工作得很好,但是在另一个项目中,他们没有使用ARC,我不确定这是否是问题所在
编辑:
-(void)closePopupWindowAnimate
{
//faux view
__block UIView* fauxView = [[UIView alloc] initWithFrame: CGRectMake(10, 10, 200, 200)];
[bgView addSubview: fauxView];
//run the animation
UIViewAnimationOptions options = UIViewAnimationOptionTransitionFlipFromLeft |
UIViewAnimationOptionAllowUserInteraction |
UIViewAnimationOptionBeginFromCurrentState;
//hold to the bigPanelView, because it'll be removed during the animation
[UIView transitionFromView:bigPanelView toView:fauxView duration:0.5 options:options completion:^(BOOL finished) {
//when popup is closed, remove all the views
for (UIView* child in bigPanelView.subviews) {
[child removeFromSuperview];
}
for (UIView* child in bgView.subviews) {
[child removeFromSuperview];
}
[bgView removeFromSuperview];
}];
}
您正在访问已发布的对象,最好使用属性,并设置属性类型
strong
(使用ARC
),以便在视图处于活动状态时,它们可以保留在内存中的位置
将您的
ui按钮
声明为类属性,它将解决您的问题。您还应该看到,您的按钮被添加到了bigPanelView
上,并且在调用方法ClosePopupUpIndowanimate
之前您正在删除此视图。如果您正在访问已经发布的对象,最好使用属性,并设置属性类型strong
(使用ARC
)所以,只要视图处于活动状态,它们就可以保留在内存中的位置
将您的
ui按钮
声明为类属性,它将解决您的问题。您还应该看到,您的按钮已添加到bigPanelView
上,并且在调用方法closePopupWindowAnimate
之前正在删除此视图。快速查看,我怀疑问题可能是closePopupWindow中的performSelector调用:按钮由bigPanelView保留,但这是在第一行发布的。这可能意味着在调用performSelector之前释放“self”
就样式而言,避免使用视图标记:最好在某种父对象中为相关视图定义属性。这也使得它更容易避免保留周期和早期版本,就像您在这里遇到的问题一样快速查看,我怀疑问题可能是closePopupWindow中的performSelector调用:按钮由bigPanelView保留,但它在第一行中被释放。这可能意味着在调用performSelector之前释放“self”
就样式而言,避免使用视图标记:最好在某种父对象中为相关视图定义属性。这还可以更容易地避免保留周期和早期版本,就像您在这里遇到的问题一样show us
closepopupmindowanimate
首先打开项目中的僵尸,这样当您的应用程序崩溃时,您可以在控制台上获得可读的错误消息产品->方案->编辑方案->诊断->为应用程序启用僵尸对象objective-c
***-[MTPopupWindow性能选择器:withObject:withObject:]:发送到解除分配实例0x8091610的消息可能与我复制它的第一个项目中存在xib文件有关。现在我正在使用Storyboard您正在访问已经发布的对象,使用属性总是一个好主意,并设置属性类型strong
,这样只要视图处于活动状态,它们就可以保留在内存中。show usclosePopupIndowanimate
首先打开项目中的僵尸,以便在应用程序崩溃时在控制台上获得可读的错误消息产品->方案->编辑方案->诊断->启用僵尸objective-c的对象
***-[MTPopupWindow性能选择器:withObject:withObject:]:发送到解除分配实例0x8091610的消息可能与我复制它的第一个项目中存在xib文件有关。现在我正在使用故事板。如果您正在访问已经发布的对象,那么最好使用属性,并设置属性类型strong
,这样只要视图处于活动状态,它们就可以保留在内存中。除了@property(strong,非原子)UIButton*closeBtn;,我还需要添加什么;?您在视图中访问的所有对象,都可以通过在类中创建dealloc方法释放它们,方法是将它们设置为nil。您的按钮将添加到bigPanelView
上,您将在调用方法之前删除此视图closepopupinowanimate
在方法调用后添加此行[[带标记的bigPanelView视图:kShadeViewTag]从SuperView移除];
[自执行选择器:@selector(ClosePopupIndowanimate),对象:nil afterDelay:0.1]
设置您要发送的对象,我现在看到您的错误消息,我相信这是因为您正在使用对象发送nil,当您添加一些详细信息时,您应该在问题中更新!除了@property(强,非原子)之外,我还需要添加什么UIButton*closeBtn;?您在视图中访问的所有对象,您可以通过在类中创建dealloc方法释放它们,方法是将它们设置为nil。您的按钮添加到bigPanelView
上,并且在调用方法ClosePopupIndowanimate
之前删除此视图[[带标记的bigPanelView视图:kShadeViewTag]从SuperView移除];
[自执行选择器:@selector(ClosePopupIndowanimate),对象:nil afterDelay:0.1]
设置您要发送的对象,我现在看到您的错误消息,我相信这是因为您正在发送nilwith object
,当您添加一些详细信息时,您应该在问题中更新!