当chiledviewcontroller按钮被点击时,应用程序崩溃

问题描述:

正在创建一个ipad应用程序,我需要在ParentViewController的视图中显示一个ChildViewController,并使用下面的代码完成它的工作。当chiledviewcontroller按钮被点击时,应用程序崩溃

- (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

+0

'' - [NSConcreteMapTable myAction:]:无法识别的选择器'意味着你有一个指向NSConcreteMapTable的指针,并且你尝试使用它来调用“myAction”。请记住,指针的类型不能保证指向的对象是那种类型 - 你可以很容易地将事情弄糟,并将错误的对象类型转换为指针。 – 2013-03-09 12:52:02

+0

我发现解决方案,我需要添加下面的代码'[self addChildViewController:aViewController];' – user1997951 2013-03-09 13:30:30

这是造成的误用UIViewControllers存储器管理错误。

在您的-viewDidLoad中创建的FavViewController未被保留,因此将在您离开该方法后立即解除分配。

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

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

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