thunk for @escaping @callee_guaranteed (@guaranteed UIAlertAction) -> ()
Asked Answered
C

1

7

I've following crash which occurs in live app, I can't reproduce it during development. Log is from Crashlytics.

I can't figure out the reason for crash and how to fix.

Any help?

Crash Log

Crashed: com.apple.main-thread
0  MyApp                          0x100f5d538 closure #2 in MyViewController.buttonTapped(_:) + 4308292920 (<compiler-generated>:4308292920)
1  MyApp                          0x101250a98 thunk for @escaping @callee_guaranteed (@guaranteed UIAlertAction) -> () + 4311386776 (<compiler-generated>:4311386776)
2  UIKitCore                      0x19cb4aed0 -[UIAlertController _invokeHandlersForAction:] + 108
3  UIKitCore                      0x19cb4b82c __103-[UIAlertController _dismissAnimated:triggeringAction:triggeredByPopoverDimmingView:dismissCompletion:]_block_invoke.458 + 28
4  UIKitCore                      0x19cdfcfe0 -[UIPresentationController transitionDidFinish:] + 952
5  UIKitCore                      0x19ce0176c __56-[UIPresentationController runTransitionForCurrentState]_block_invoke.503 + 208
6  UIKitCore                      0x19cf055a8 -[_UIViewControllerTransitionContext completeTransition:] + 100
7  UIKitCore                      0x19d981d90 -[UIViewAnimationBlockDelegate _didEndBlockAnimation:finished:context:] + 588
8  UIKitCore                      0x19d955c70 -[UIViewAnimationState sendDelegateAnimationDidStop:finished:] + 244
9  UIKitCore                      0x19d956178 -[UIViewAnimationState animationDidStop:finished:] + 240
10 UIKitCore                      0x19d9562c8 -[UIViewAnimationState animationDidStop:finished:] + 576
11 QuartzCore                     0x19ff07dac CA::Layer::run_animation_callbacks(void*) + 276
12 libdispatch.dylib              0x19913f184 _dispatch_client_callout + 16
13 libdispatch.dylib              0x1990f1190 _dispatch_main_queue_callback_4CF$VARIANT$mp + 1044
14 CoreFoundation                 0x1993f05e4 __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 12
15 CoreFoundation                 0x1993eb5d8 __CFRunLoopRun + 2004
16 CoreFoundation                 0x1993eaadc CFRunLoopRunSpecific + 464
17 GraphicsServices               0x1a338b328 GSEventRunModal + 104
18 UIKitCore                      0x19d4f863c UIApplicationMain + 1936
19 MyApp                          0x100f24840 main + 21 (ProfileViewController.swift:21)
20 libdyld.dylib                  0x199274360 start + 4

MyViewController.swift

@IBAction func buttonTapped(_ sender: UIButton) {

    let alert = UIAlertController(title: "Delete", message: "", preferredStyle: .alert)

    let cancelAction = UIAlertAction(title: "Cancel", style: UIAlertAction.Style.cancel) { (action) in
        return
    }

    let deleteAction = UIAlertAction(title: "Delete", style: UIAlertAction.Style.default) { (action) in
        let indexPathRow = sender.tag

        guard indexPathRow >= 0 else {
            return
        }

        guard let id = self.dataSource[indexPathRow].id else {
            return
        }
        self.delete(id: id)
    }

    alert.addAction(cancelAction)
    alert.addAction(deleteAction)

    DispatchQueue.main.async {
        self.present(alert, animated: true, completion: nil)
    }
}
Chumley answered 25/4, 2020 at 17:4 Comment(0)
A
5

Try the following

@IBAction func buttonTapped(_ sender: UIButton) {

    let alert = UIAlertController(title: "Delete", message: "", preferredStyle: .alert)

    let cancelAction = UIAlertAction(title: "Cancel", style: UIAlertAction.Style.cancel) { (action) in
        return
    }

    // prepare data on stack call
    let indexPathRow = sender.tag
    guard indexPathRow >= 0 else { return }
    guard let id = self.dataSource[indexPathRow].id else { return }

    let deleteAction = UIAlertAction(title: "Delete", 
            style: UIAlertAction.Style.default) { [weak self] (action) in
        self?.delete(id: id)
    }

    alert.addAction(cancelAction)
    alert.addAction(deleteAction)

    DispatchQueue.main.async { [weak self] in
        self?.present(alert, animated: true, completion: nil)
    }
}
Auliffe answered 25/4, 2020 at 17:29 Comment(4)
Thanks for reply, I've implemented it. Will have to wait for few days to find out if it has fixed issue as it happens only in live app. I'll update after a week or so.Chumley
Hi @Raymond, what is the conclusion? Did it worked? Was the problem caused by the strong reference to self?Countersink
What does putting '[weak self] in actually do?Shears
Weak self and add guard after too. This way it will never crash. Retain cycles guys.Retrospective

© 2022 - 2024 — McMap. All rights reserved.