【问题标题】:Crashes when calling delegate method inside URLSession closure在 URLSession 闭包中调用委托方法时崩溃
【发布时间】:2018-06-27 15:35:17
【问题描述】:

我创建了名为 FileTransferManager 的类,它使用 URLSession 管理上传/下载任务。

由于代码的长度,我创建了我的代码的要点。 :https://gist.github.com/Cyanide7523/eb2f7a743459055e13b8568a51f644f3

我创建了委托协议来识别传输结果。

这是该类的示例用法:

class SampleViewController: UIViewController, FileTransferDelegate{

    let fileMan = FileTransferManager()

    fileMan.delegate = self

    fileMan.download( /* Some parameters */ )

    func fileTransferManager(_ sender: FileTransferManager, didSucceedDownload data: Data, ...) {

        print("Download Succeed!")
    }
}

但是当FileTransferManager 调用委托函数时,App 总是崩溃并显示消息“无法识别的选择器发送到实例”,我不知道为什么会崩溃。

+++ 错误日志

2018-06-27 14:31:57.851160+0900 Project[1428:2194695] -[Project.InitialViewController fileTransferManagerWithSender:willDownload:at:]: unrecognized selector sent to instance 0x10207a0e0
2018-06-27 14:31:57.851783+0900 Project[1428:2194695] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[Project.InitialViewController fileTransferManagerWithSender:willDownload:at:]: unrecognized selector sent to instance 0x10207a0e0'
*** First throw call stack:
(0x184d1ad8c 0x183ed45ec 0x184d28098 0x18ee0adb0 0x184d202d4 0x184c0641c 0x1003974b0 0x100399094 0x100396d8c 0x1852a9e4c 0x1852c2b6c 0x185742e88 0x1856848d0 0x185683cac 0x101ec119c 0x101ecd7cc 0x101ec119c 0x101ecd7cc 0x101ecd6b0 0x185744750 0x101ec119c 0x101ece454 0x101eccd44 0x101ed27c8 0x101ed2500 0x18493ffac 0x18493fb08)
libc++abi.dylib: terminating with uncaught exception of type NSException
(lldb) 

【问题讨论】:

  • 为什么要强行解开方法self.delegate?.fileTransferManager! ?
  • '因为 Xcode 告诉我错误:Value of optional type '((FileTransferManager, String, String, String?, Error) -> ())?' not unwrapped; did you mean to use '!' or '?'? 所以我把它说出来了。会出问题吗?
  • 好的。 Xcode 告诉你,因为协议中的方法是“可选的”。 URSession 可能会调用您实现的“didSucceedDownload”以外的一些方法。在强制解包“可选”方法的情况下,它应该在符合协议的类中实现。
  • 那么编辑方法self.delegate?.fileTransferManager!self.delegate?.fileTransferManager?会解决问题吗?看起来 Xcode 并没有告诉任何错误。

标签: swift crash urlsession


【解决方案1】:

您是否在InitialViewController 中实现@objc optional func fileTransferManager(_ sender: FileTransferManager, willDownload contentID: String, at room: String) 方法?此外,使您的 FileTransferManager 委托引用“弱”并在您调用委托方法时删除所有强制解包(只需将“!”替换为“?”)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多