将一个视图控制器的视图作为子视图添加到另一个视图控制器的视图后,出现EXC_BAD_ACCESS错误?

5

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

-(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]];
}

SecondViewController *sample=[[MedicationsList alloc]init]; 这是什么?你如何编译代码?MedicationsListSecondViewController 的子类吗? - danypata
@dannypata 我已经纠正了这个问题。 - vignesh kumar
你应该启用异常断点并检查导致程序崩溃的代码行。如果你不知道如何解决问题,就在崩溃出现的那一行发帖寻求帮助。 ;) - danypata
应用程序是在第一次还是第二次点击按钮时崩溃的? - danypata
@danypata 在第二个(即新增的)上。 - vignesh kumar
2个回答

5
问题在于SecondViewController没有被分配到强变量/属性,因此当方法返回时,它就会被释放。
在方法内部指向对象的任何变量(如果我没记错的话,称为自动变量)将在方法返回时从内存中删除。因此,由该变量指向的对象将被释放。如果这个对象在其他地方没有被保留,例如赋值给一个强属性或实例变量,那么它就会被销毁。现在,你所做的是抓取第二个视图控制器的视图,并将其粘贴到定义此方法的视图控制器视图的视图层次结构中。方法返回,变量从堆栈中弹出,SampleViewController没有以任何方式被保留,因此它被释放了。任何“新”视图执行的操作,如按钮点击事件通知等,将导致崩溃,因为该视图控制器不再存在于内存中。
顺便说一句,你只是没做对。如果想编写自定义容器,请查看View Controller Containment API。

3

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

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


因为在xib中的按钮分配了其目标,但没有保留。请查看此方法theCheckoutViewisExpandedwitPatient,他在哪里保留了他的第二个视图控制器?他只是分配了视图控制器.. - Mani
首先,如果您从xib添加按钮的目标,则方法将类似于-(IBAction)nameOfTheMethod,而不是-(void)nameOfTheMethod。其次,当他在第一个视图控制器中点击第一个按钮时,应用程序会崩溃。第三,问题有点不清楚,也许我们两个都没有理解它:)) - danypata
不不不,你说的是“选择器”。我在谈论的是“目标”,就像“button.target = self;”一样。它是在xib中进行连接的。 - Mani
@1211532 第二个按钮在第二个视图控制器里面,对吗? - Mani
1
当您尝试单击位于firstviewcontroller视图层次结构视图中但其目标为已释放的secondviewcontroller的第二个视图控制器按钮时,它会崩溃,因为它找不到其目标内存。 - Mani
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接