[CustomViewController respondsToSelector:]:消息发送到释放的实例
Posted
技术标签:
【中文标题】[CustomViewController respondsToSelector:]:消息发送到释放的实例【英文标题】:[CustomViewController respondsToSelector:]: message sent to deallocated instance 【发布时间】:2013-08-17 22:57:54 【问题描述】:这在我的 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
是强属性。
【问题讨论】:
快速提问:你说你从另一个开发者那里继承了这个。您是否有可能将主“主根视图”添加到 UIWindow,然后在其顶部添加“首次启动”视图,没有动画? 嗨,贾斯汀,didFinishLaunchingWithOptions
方法调用了showHome
方法,当单击位于根视图(在拆分视图中)上的主页按钮时,会调用相同的方法 (showHome
)。
当用户触摸表格中的一行时,您将在另一个类中分配一个新的 CustomViewController,或者类似的东西。我认为您应该将该逻辑移至didFinishLaunching
,但只需在 CustomView 顶部显示其他表单视图并在必要时将其关闭
【参考方案1】:
我通过在 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;
【讨论】:
【参考方案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);
【讨论】:
嗨,贾斯汀,感谢您的回复,当我使用仪器分析我的应用程序时,我用一些堆栈跟踪编辑了我的帖子。关于homeController
,我在showHome
方法上从一个nib 文件中分配了它,但仍然遇到同样的崩溃,所以这似乎不是根本原因,请查看上面的堆栈跟踪。谢谢。
查看我的编辑。将 for() 循环放在使您崩溃的行上方。在 NSLog() 行上设置断点。当您继续时,检查并查看控制台在每次通过 for 循环时显示的内容。
嗨,贾斯汀,我刚刚调试了 viewController 数组,它在崩溃前向我显示了两个控制器:Object: <UINavigationController: 0x784d100>Object: <CustInfoViewController: 0x1515dc80>
So 两个视图控制器。【参考方案3】:
我遇到了同样的问题。如果你没有使用“dealloc”方法,那么使用“viewWillDisappear”来设置 nil。
很难找到哪个代理导致问题,因为它没有为我的应用程序指示任何行或代码语句所以我尝试了一些方法来识别代理,也许它会对你有所帮助。
1.打开 xib 文件并从文件的所有者处,选择“显示连接检查器”右侧菜单。列出了代表,将它们设置为 nil,这是可疑的。
-
(和我的情况一样)像 Textfield 这样的属性对象会产生问题,所以将其委托设置为 nil。
-(void) viewWillDisappear:(BOOL) animated [super viewWillDisappear:animated]; if ([self isMovingFromParentViewController]) self.countryTextField.delegate = nil; self.stateTextField.delegate = nil;
【讨论】:
以上是关于[CustomViewController respondsToSelector:]:消息发送到释放的实例的主要内容,如果未能解决你的问题,请参考以下文章
带有情节提要的 viewController 自定义初始化方法