【问题标题】:Error when getting AppDelegate instance in other UIViewController在其他 UIViewController 中获取 AppDelegate 实例时出错
【发布时间】:2018-08-24 09:21:01
【问题描述】:

您好,我一直在看到我的应用程序的崩溃日志,当我在 XCode 中打开时会突出显示以下行

let appDelegate = UIApplication.shared.delegate as! AppDelegate

我很难过,因为我无法在 XCode 中复制它。应用程序在此处崩溃的可能原因是什么?

此行位于viewDidAppear()viewDidLoad(),但五分之五的崩溃报告都指向viewDidAppear() 处的行

编辑:

这是崩溃日志

Thread 0 name:
Thread 0 Crashed:
0   MyApp                           0x0000000100531208 LoginViewController.initView() + 536 (LoginViewController.swift:107)
1   MyApp                           0x0000000100530d88 @objc LoginViewController.viewDidAppear(_:) + 112 (LoginViewController.swift:58)
2   UIKit                           0x000000018ee2973c -[UIViewController _setViewAppearState:isAnimating:] + 840 (UIViewController.m:4471)
3   UIKit                           0x000000018f07a448 __64-[UIViewController viewDidMoveToWindow:shouldAppearOrDisappear:]_block_invoke + 44 (UIViewController.m:5055)
4   UIKit                           0x000000018ee7f798 -[UIViewController _executeAfterAppearanceBlock] + 92 (UIViewController.m:4793)
5   UIKit                           0x000000018f185990 _runAfterCACommitDeferredBlocks + 564 (UIApplication.m:2528)
6   UIKit                           0x000000018f17b958 _cleanUpAfterCAFlushAndRunDeferredBlocks + 384 (UIApplication.m:2497)
7   UIKit                           0x000000018f18c68c __34-[UIApplication _firstCommitBlock]_block_invoke_2 + 152 (UIApplication.m:9928)
8   CoreFoundation                  0x00000001851372bc __CFRUNLOOP_IS_CALLING_OUT_TO_A_BLOCK__ + 20 (CFRunLoop.c:1840)
9   CoreFoundation                  0x0000000185136a7c __CFRunLoopDoBlocks + 264 (CFRunLoop.c:1881)
10  CoreFoundation                  0x00000001851347b0 __CFRunLoopRun + 1224 (CFRunLoop.c:2922)
11  CoreFoundation                  0x0000000185054da8 CFRunLoopRunSpecific + 552 (CFRunLoop.c:3245)
12  GraphicsServices                0x000000018703a020 GSEventRunModal + 100 (GSEvent.c:2245)
13  UIKit                           0x000000018f074758 UIApplicationMain + 236 (UIApplication.m:3965)
14  MyApp                           0x0000000100424f3c main + 56 (BaseViewController.swift:19)
15  libdyld.dylib                   0x0000000184ae5fc0 start + 4

【问题讨论】:

  • 崩溃报告说什么?
  • 崩溃日志中有什么?
  • 添加了崩溃日志
  • 有崩溃信息吗?
  • @Lumialxk 我找不到任何崩溃消息

标签: ios swift crash appdelegate


【解决方案1】:

我发现这个委托是可选值。

unowned(unsafe) open var delegate: UIApplicationDelegate?

所以你应该这样使用它。

if let appDelegate = UIApplication.shared.delegate as? AppDelegate {
    // code here
} else {
    // error handle
}

【讨论】:

  • 但是我在开发过程中怎么从来没有遇到过这种情况呢?同样正如我在问题中所说,我在 viewDidLoad() 调用了同样的东西,它不会在那里崩溃。如果这是 nil 值的情况,它不会在那里崩溃吗?
  • @Leon 如果你使用'as!'展开,当得到一个 nil 值时它会崩溃。如果你想复制这个错误,你应该分配设备和操作系统版本。
  • 好吧,我用'as!'因为我同意这里的答案forums.developer.apple.com/thread/80810。这可能有待商榷,但如果我的 AppDelegate 为 nil,那么我很可能稍后会遇到其他类型的错误,所以我宁愿让应用程序在那里崩溃
【解决方案2】:

我终于想通了。崩溃日志都指向这一行

let appDelegate = UIApplication.shared.delegate as! AppDelegate

这是我的 LoginViewController 的第 107 行,但实际错误实际上是由前两行的代码行触发的(数据相关错误)。不知道为什么日志都指向第 107 行。感谢您的帮助。

【讨论】:

    猜你喜欢
    • 2021-09-25
    • 1970-01-01
    • 2014-08-29
    • 2012-03-10
    • 1970-01-01
    • 2018-01-09
    • 2017-04-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多