0

这对于我的 pre-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

custinfoVC并且appDescVC是强大的属性。

4

3 回答 3

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;
}
于 2013-10-11T01:57:56.620 回答
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);
}
于 2013-08-15T17:31:52.380 回答
0

我遇到了同样的问题。如果您不使用“dealloc”方法,则使用“viewWillDisappear”设置为零。

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

1.打开xib文件并从文件所有者处,选择“显示连接检查器”右侧菜单。代表被列出,将它们设置为 nil 是可疑的。

  1. (与我的情况相同)像 Textfield 这样的属性对象可以创建问题,因此将其委托设置为 nil。
-(void) viewWillDisappear:(BOOL) animated{

[super viewWillDisappear:animated];

if ([self isMovingFromParentViewController]){

self.countryTextField.delegate = nil;

self.stateTextField.delegate = nil;

}

}
于 2016-01-12T06:04:31.563 回答