AppDelegate 类声明中的 EXC_BAD_ACCESS
Posted
技术标签:
【中文标题】AppDelegate 类声明中的 EXC_BAD_ACCESS【英文标题】:EXC_BAD_ACCESS in AppDelegate class declaration 【发布时间】:2014-12-12 01:06:44 【问题描述】:在我的应用程序中使用 EXC_BAD_ACCESS 错误(代码为 EXC_I386_GPFLT)时,我遇到了问题。我一直无法找到有关这方面的太多信息,因为我编写的任何代码都没有被指出是罪魁祸首。错误发生在行
class AppDelegate: UIResponder, UIApplicationDelegate
我什至没有写。当我写的任何内容都显示为不正确时,我不确定如何确定什么是错误访问。
为了让问题更深入一点,
我有一个包含导航控制器的故事板,它有一个 ViewController 作为它的根视图控制器。 The ViewController has a table view that, when a cell is selected, segues to another ViewController.然后,该 ViewController 可以通过点击手势 segue 转到第三个 ViewController。第三个控制器是导航控制器的委托,我在第二个 ViewController 的 prepareForSegue 方法中设置它,
var dvc = segue.destinationViewController as BlockingViewController
self.navigationController!.delegate = dvc
我在尝试禁用由导航控制器自动创建的 InteractivePopoverGestureRecognizer 时遇到了这个问题。为此,我在第二个和第三个 ViewControllers 的 viewDidLoad 方法中添加了以下代码:
var barItem: UIBarButtonItem = UIBarButtonItem(title: "Back", style: UIBarButtonItemStyle.Plain, target: self, action: "backButtonPressed")
self.navigationItem.leftBarButtonItem = barItem
并创建了一个 backButtonPressed 方法:
func backButtonPressed()
self.navigationController?.popViewControllerAnimated(true)
当我执行以下操作序列时发生错误:
VC1 -> VC2 -> VC3 -> VC2 -> VC1
当我执行以下操作序列时不会发生错误:
VC1 -> VC2 -> VC1
因此,VC3 中一定发生了导致问题的原因。我唯一能想到的是我将它设置为导航控制器的委托,这让我想知道它是否可能在从 VC2 -> VC1 的转场期间尝试访问委托,这会导致错误,因为delegate 现在为零。
这可能是问题吗?如果没有,任何关于可能是什么问题的见解都会非常有帮助。
编辑:我在没有设置 navigationController 委托的情况下尝试了同一系列的事件,但没有遇到同样的问题。保持这种状态的唯一问题是我需要 navigationController 委托,这样当我在 VC3 和 VC2 之间进行切换时,我可以在它们之间传递信息。
【问题讨论】:
【参考方案1】:当我执行从 VC3 到 VC2 的转场时,我发现当我将 navigationController 委托设置回 nil 时问题停止了。我认为问题在于委托属性仍在引用 VC3,但 VC3 不再存在,因此当 navigationController 尝试执行我实现的 viewWillAppear 方法时,它试图作为委托访问的对象不再存在。
【讨论】:
【参考方案2】:我遇到了类似的问题,它与调用自定义 segue 的 init 方法时的 CFString... 方法调用有关。我通过在 StoryBoard Segue“属性检查器”中设置 am Identifier 解决了这个问题,这可能是我正在使用的 xcode 版本(6.4)的一个错误。
【讨论】:
以上是关于AppDelegate 类声明中的 EXC_BAD_ACCESS的主要内容,如果未能解决你的问题,请参考以下文章
在 swift 中将 AppDelegate 类声明为“final”是不好的做法吗?
在 iOS 9.1/9.2 上使用 EXC_BAD_ACCESS CODE 1 的 AppDelegate 类声明应用程序崩溃