Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/115.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 当使用关闭按钮时,objc_msgSend EXC_BAD_访问_Ios_Objective C_Xcode_Uiview_Uibutton - Fatal编程技术网

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 us
closePopupIndowanimate
首先打开项目中的僵尸,以便在应用程序崩溃时在控制台上获得可读的错误消息
产品->方案->编辑方案->诊断->启用僵尸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]
设置您要发送的对象,我现在看到您的错误消息,我相信这是因为您正在发送nil
with object
,当您添加一些详细信息时,您应该在问题中更新!