将viewcontroller'view作为subView添加到另一个viewcontroller的视图后得到EXC_BAD_ACCESS错误?

时间:2013-05-17 13:46:38

标签: ios uiviewcontroller exc-bad-access

在我的应用程序中,我有两个视图控制器。第一个Viewcontroller是应用程序窗口的rootViewController。单击第一个ViewController中的Button时,我将第二个Viewcontroller的视图作为subView添加到第一个视图中,第二个ViewController视图中有一个Button,我的问题是当我点击该按钮时应用程序崩溃

-(void)theCheckoutViewisExpandedwitPatient:(id)patient
{
    SecondViewController *sample=[[SecondViewController alloc]init];
    CGRect rect=sample.view.frame;
    rect.origin.y=30;
    rect.origin.x=305;
    [sample.view setFrame:rect];
    [self.view addSubview:[sample view]];
}

2 个答案:

答案 0 :(得分:4)

问题是SecondViewController没有分配给强变量/属性,因此在方法返回时会释放它。

当方法返回时,在方法内部(如果我没记错的话,称为自动变量)指向对象的任何变量都将从内存中删除。结果,该变量指向的对象将被释放。如果此对象未在其他任何位置保留,例如,通过分配强属性或强实例变量,将取消分配该对象。现在,您正在做的是,您获取第二个视图控制器的视图并将其粘贴到视图控制器视图的视图层次结构中,其中定义了此方法。该方法返回,变量从堆栈弹出,SampleViewController不以任何方式保留,因此它被释放。 “新”视图执行的任何操作,导致对其视图控制器(第二个视图控制器)的调用,例如按钮点击事件通知,将最终崩溃,因为该视图控制器不再在内存中。

顺便说一下。你只是做得不对。如果您想编写自定义容器,请查看View Controller Containment API。

答案 1 :(得分:3)

是问题在这里。当您单击按钮时,它会尝试触发secondviewcontroller中的方法。但在调用之前,在此方法调用get dealloc之后,secondviewcontroller将超出范围(theCheckoutViewisExpandedwitPatient)。

我们可以简单地说[button->target not alive]