1

我正在创建一个 ipad 应用程序,我需要在 ParentViewController 的视图中显示一个 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

4

1 回答 1

3

这是一个由误用导致的内存管理错误UIViewControllers

FavViewController-viewDidLoad中创建的不会保留,因此在您离开该方法后不久将被释放。

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

您看到的错误是因为NSConcreteMapTablenow 的一个实例恰好占用了曾经包含您的FavViewController.

此外,您不应随意嵌套属于UIViewController此类子类的视图。如果您需要这样做,您应该使用“容器视图控制器”方法来管理这些子控制器。- addChildViewController:是其中一种方法,并且恰好解决了问题,因为父视图控制器现在保留对子控制器的引用,因此不会被释放。

于 2013-03-09T17:12:14.990 回答