当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
这是造成的误用UIViewControllers
存储器管理错误。
在您的-viewDidLoad
中创建的FavViewController
未被保留,因此将在您离开该方法后立即解除分配。
您已经使用控制器创建了一个视图,从该视图内的控件到控件的绑定操作,允许控制器被销毁,然后尝试通过点击按钮来触发其中一个操作。
您看到的错误是因为NSConcreteMapTable
的一个实例现在占用了曾经包含您的FavViewController
的内存空间。
此外,您不希望任意嵌套属于这样的UIViewController
子类的视图。如果你需要这样做,你应该使用“容器视图控制器”方法来管理这些子控制器。 - addChildViewController:
就是这些方法之一,并且恰好解决了这个问题,因为父视图控制器现在保留对子控制器的引用,所以它不会被解除分配。
'' - [NSConcreteMapTable myAction:]:无法识别的选择器'意味着你有一个指向NSConcreteMapTable的指针,并且你尝试使用它来调用“myAction”。请记住,指针的类型不能保证指向的对象是那种类型 - 你可以很容易地将事情弄糟,并将错误的对象类型转换为指针。 – 2013-03-09 12:52:02
我发现解决方案,我需要添加下面的代码'[self addChildViewController:aViewController];' – user1997951 2013-03-09 13:30:30