Search code examples
iosswiftuitextfieldguard

Crashed: com.apple.main-thread - App crashes randomly on guard statement


I've a random crash in live app. It crashes on guard statement. Following is the code snippet. I'm not able to understand why it crashes on guard which was suppose to guard against crashes like this?

How to fix this issue or how do I go about investigating it?

Crashlytics log

Crashed: com.apple.main-thread
EXC_BREAKPOINT 0x0000000102419850

0  myApp                          0x102426f50 MessageVC.validate() + 101 (MessageVC.swift:101)
1  myApp                          0x1024272d8 @objc MessageVC.buttonTapped(_:) + 239 (MessageVC.swift:239)
2  UIKitCore                      0x1a6a8d9ac <redacted> + 96
3  UIKitCore                      0x1a64c3fbc <redacted> + 240
4  UIKitCore                      0x1a64c4320 <redacted> + 408
5  UIKitCore                      0x1a64c333c <redacted> + 520
6  UIKitCore                      0x1a6674a58 <redacted> + 7636
7  CoreFoundation                 0x1a2983e68 <redacted> + 32
8  CoreFoundation                 0x1a297ed54 <redacted> + 416
9  CoreFoundation                 0x1a297f320 <redacted> + 1308
10 CoreFoundation                 0x1a297eadc CFRunLoopRunSpecific + 464
11 GraphicsServices               0x1ac91f328 GSEventRunModal + 104
12 UIKitCore                      0x1a6a8c63c UIApplicationMain + 1936
13 myApp                          0x1023eb850 main + 21 (ProfileVC.swift:11)
14 libdyld.dylib                  0x1a2808360 <redacted> + 4

Model.swift

struct ProfileStatus: Decodable {
    var status: Bool?
    var error: String?
}

MessageVC.swift

var profileStatus: ProfileStatus!

func validate() -> Bool {

    guard let status = profileStatus.status else { // Line no. 101, Crash here
        return true
    }
    // Do something...
}

@IBAction func buttonTapped(_ sender: UIButton) {
    if validate() { // Line no. 239
        // Do something..
    }
}

ProfileVC.swift

class ProfileVC: UIViewController {
    @IBOutlet weak var textField: MyTextField! // Line no. 11
    // ....
}

Solution

  • The reason of crash in force unwrap

    var profileStatus: ProfileStatus! // << here is the reason
    

    so you need to find in other code where ownership is lost, and, which is anyway good practice

    var profileStatus: ProfileStatus? // use optional and unwrap where needed conditonally
    
    func validate() -> Bool {
    
        guard let status = profileStatus?.status else {