[CustomViewController respondsToSelector:]:发送到解除分配的实例的消息

时间:2013-08-15 17:17:42

标签: ios memory-management automatic-ref-counting uisplitviewcontroller

这用于我的ARC前代码工作正常,但由于重构所有项目是ARC兼容的,我开始遇到这个崩溃:

[CustomViewController respondsToSelector:]: message sent to deallocated instance

我的项目是一个具有拆分视图的iPad应用程序,但与苹果文档相反,之前的开发人员已经在拆分视图之前在应用程序启动时显示另一个视图控制器。所以我知道这不是正确的方法,但正如我所说它在ARC集成之前曾经工作过,所以我需要解决这个问题。

根视图控制器,其中包含项目菜单,每个项目显示要填充的详细信息表单,然后单击下一个按钮移动到下一个详细信息屏幕等。

当我点击根视图上的主页按钮返回主视图时,问题就开始了,这是将用户移动到主屏幕的相关代码:

//this method is in the appdelegate, and it gets called when clikc on home button located on the root view
- (void) showHome
{
    homeController.delegate = self;

    self.window.rootViewController = homeController;
    [self.window makeKeyAndVisible];
}

然后,当我单击按钮返回拆分视图(根/详细信息视图的位置)时,应用程序崩溃并显示上述说明。我使用工具分析了应用程序,并且负责的代码行位于RootViewController,在didSelectRowAtIndexPath方法中,以下是相关代码:

    if(indexPath.row == MenuCustomViewController){
            self.customVC=[[CustomViewController alloc] initWithNibName:@"CustomVC"
                                                                      bundle:nil];
            [viewControllerArray addObject:self.customVC];
            self.appDelegate.splitViewController.delegate = self.customVC;
}

customVC是一个强大的属性,我试图直接分配并分配给实例变量,但这无助于修复崩溃。有什么想法吗?

修改 这是仪器给出的堆栈跟踪:

[self.appDelegate.splitViewController setViewControllers:viewControllerArray];//this line caused the crash

[viewControllerArray addObject:self.appDescVC];//this statement is called before the above one

self.custinfoVC=[[CustInfoViewController alloc] initWithNibName:@"CustInfo" bundle:nil];//this statement is called before the above one

self.appDelegate.splitViewController.delegate = self.appDescVC;//this statement is called before the above one

custinfoVCappDescVC是强大的属性。

3 个答案:

答案 0 :(得分:5)

我通过在dealloc方法中将我的委托和数据源设置为nil来解决这个问题。不确定它是否会对你有所帮助,但值得一试。

- (void)dealloc
{
    homeController.delegate = nil;

    //if you have any table views these would also need to be set to nil
    self.tableView.delegate = nil;
    self.tableView.dataSource = nil;
}

答案 1 :(得分:2)

您可能希望在应用启动期间设置CustomViewController,并在必要时以模态方式显示其他视图。您获得的错误消息是因为ARC过早地释放了某些内容。之前可能没有表现出来,因为弧前的东西并不总是立即解除分配。 ARC在离开范围时发布内容非常认真

很难说没有看到更多涉及的代码,它打破了什么线等等。

此:

- (void) showHome {
    //THIS: where is homeController allocated?
    homeController.delegate = self;

    self.window.rootViewController = homeController;
    [self.window makeKeyAndVisible];

}

编辑:

在导致崩溃的行的正上方添加此行

for (id object in viewControllerArray) {
    NSLog(@"Object: %@",object);
}

答案 2 :(得分:0)

我有同样的问题。如果你没有使用" dealloc"方法然后使用" viewWillDisappear"设置为零。

很难找到哪个委托原因问题,因为它没有表明我的应用程序的任何行或代码声明所以我尝试了一些方法来识别委托,也许它对你有帮助。

1.打开xib文件并从文件的所有者处选择"显示连接检查器"右侧菜单。列出代表,将其设置为零,这是怀疑的。

  1. (与我的情况相同)像Textfield这样的属性对象可以创建问题,因此将其委托设置为nil。
  2. -(void) viewWillDisappear:(BOOL) animated{
    
    [super viewWillDisappear:animated];
    
    if ([self isMovingFromParentViewController]){
    
    self.countryTextField.delegate = nil;
    
    self.stateTextField.delegate = nil;
    
    }
    
    }