单击子视图控制器按钮时应用程序崩溃

时间:2013-03-09 10:45:43

标签: xcode ipad uiviewcontroller uibutton

正在创建一个ipad应用程序,我需要在ParentViewController的View中显示一个ChildViewController,下面的代码可以完美地运行。

- (void)viewDidLoad
{
   FavViewController *aViewController = [[FavViewController alloc] initWithNibName:@"FavViewController" bundle:nil];
   [self.mainView addSubview:aViewController.view];
   [super viewDidLoad];
}

当这个favViewController加载到父视图的self.MainView时,childViewController中的所有控件都显示正常,但是当我点击UIButton时,应用程序崩溃了。下面是崩溃的日志。

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSConcreteMapTable myAction:]: unrecognized selector sent to instance 0x8093170' *** First throw call stack: (0x1733012 0x1558e7e 0x17be4bd 0x1722bbc 0x172294e 0x156c705 0x4a02c0 0x4a0258 0x561021 0x56157f 0x560222 0x4cfb1d 0x4cff02 0x4add4a 0x49f698 0x25fddf9 0x25fdad0 0x16a8bf5 0x16a8962 0x16d9bb6 0x16d8f44 0x16d8e1b 0x25fc7e3 0x25fc668 0x49cffc 0x255d 0x2485 0x1) libc++abi.dylib: terminate called throwing an exception

1 个答案:

答案 0 :(得分:3)

这是因误用UIViewControllers而导致的内存管理错误。

FavViewController中创建的-viewDidLoad不会被保留,因此您将在离开该方法后立即取消分配。

您已经创建了一个带控制器的视图,将该视图中控件的操作绑定到控件,允许控制器被销毁,然后尝试通过点击按钮来触发其中一个操作。

您看到的错误是因为NSConcreteMapTable的实例现在恰好占用了曾经包含FavViewController的内存空间。

此外,您不应随意嵌套属于UIViewController子类的视图。如果您需要这样做,您应该使用“容器视图控制器”方法来管理这些子控制器。 - addChildViewController:是这些方法之一,碰巧解决了这个问题,因为父视图控制器现在保留了对子控制器的引用,因此它不会被解除分配。