【问题标题】:App crashes when chiledviewcontroller button clicked单击子视图控制器按钮时应用程序崩溃
【发布时间】:2013-02-24 22:21:40
【问题描述】:

我正在创建一个 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

【问题讨论】:

  • '-[NSConcreteMapTable myAction:]: unrecognized selector 表示您在某处有一个指向 NSConcreteMapTable 的指针,并且您尝试使用它调用“myAction”。记住,指针的类型并不能保证指向的对象就是那个类型——你很容易搞砸并把错误的对象类型放入指针中。
  • 我找到了解决方案,我需要添加以下代码 '[self addChildViewController:aViewController];'

标签: xcode ipad uiviewcontroller uibutton


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-13
    • 2017-07-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多