获取 NSException 错误崩溃应用程序

Posted

技术标签:

【中文标题】获取 NSException 错误崩溃应用程序【英文标题】:Getting NSException Error Crash App 【发布时间】:2018-08-23 07:51:08 【问题描述】:

所以我得到了一个 NSException 错误,即使我的代码没有任何问题。在我得到 NSException 之前,我添加了一个文件私有函数here

fileprivate func uploadToFirebaseStorageUsingImage(image: UIImage) 
    let imageName = UUID().uuidString
    let ref = Storage.storage().reference().child("message_images").child("\(imageName).jpg")

    if let uploadData = UIImageJPEGRepresentation(image, 0.2) 

        ref.putData(uploadData, metadata: nil, completion:  (metadata, error) in

            if error != nil 
                print("Failed to upload image:", error!)
                return
            

            ref.downloadURL(completion:  (url, error) in

                guard let downloadURL = url else
                    print("an error occured")
                    return
                

                let imageUrl = downloadURL.absoluteString
                self.sendMessageWithImageUrl(imageUrl, image: image)

            )
        )
    

还有完整的错误here

2018-08-23 14:48:04.985710+0700 nextstore[33702:369585] *** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<nextstore.User 0x60800011f920> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key name.'
*** First throw call stack:
(
    0   CoreFoundation                      0x0000000109d251e6 __exceptionPreprocess + 294
    1   libobjc.A.dylib                     0x00000001093ba031 objc_exception_throw + 48
    2   CoreFoundation                      0x0000000109d250b9 -[NSException raise] + 9
    3   Foundation                          0x00000001086c8b47 -[NSObject(NSKeyValueCoding) setValue:forKey:] + 292
    4   Foundation                          0x0000000108726c02 -[NSObject(NSKeyValueCoding) setValuesForKeysWithDictionary:] + 283
    5   nextstore                           0x000000010724da39 _T09nextstore18MessagesControllerC28fetchUserAndSetupNavBarTitleyyFySo12DataSnapshotCcfU_ + 713
    6   nextstore                           0x000000010724db1d _T09nextstore18MessagesControllerC28fetchUserAndSetupNavBarTitleyyFySo12DataSnapshotCcfU_TA + 13
    7   nextstore                           0x00000001072338d2 _T0So12DataSnapshotCIegx_ABIeyBy_TR + 66
    8   nextstore                           0x000000010730d0e6 __71-[FIRDatabaseQuery observeSingleEventOfType:withBlock:withCancelBlock:]_block_invoke + 118
    9   nextstore                           0x000000010730d5c8 __92-[FIRDatabaseQuery observeSingleEventOfType:andPreviousSiblingKeyWithBlock:withCancelBlock:]_block_invoke + 184
    10  nextstore                           0x00000001072ebc1a __43-[FChildEventRegistration fireEvent:queue:]_block_invoke.68 + 122
    11  libdispatch.dylib                   0x000000010da737ab _dispatch_call_block_and_release + 12
    12  libdispatch.dylib                   0x000000010da747ec _dispatch_client_callout + 8
    13  libdispatch.dylib                   0x000000010da7f8cf _dispatch_main_queue_callback_4CF + 628
    14  CoreFoundation                      0x0000000109ce7c99 __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 9
    15  CoreFoundation                      0x0000000109cabea6 __CFRunLoopRun + 2342
    16  CoreFoundation                      0x0000000109cab30b CFRunLoopRunSpecific + 635
    17  GraphicsServices                    0x000000010ef06a73 GSEventRunModal + 62
    18  UIKit                               0x000000010ad94057 UIApplicationMain + 159
    19  nextstore                           0x000000010726e5c7 main + 55
    20  libdyld.dylib                       0x000000010daf1955 start + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException

我的代码没有任何错误。但是当我使用模拟器运行时,一旦它打开应用程序,它就会立即崩溃 我的问题有什么解决办法吗,谢谢

编辑

我的用户类是这样的:

 class User: NSObject 
    var id: String?
    var name: String?
    var email: String?
    var profileImageUrl: String?

    init(dictionary: [String: AnyObject]) 
        self.id = dictionary["id"] as? String
        self.name = dictionary["name"] as? String
        self.email = dictionary["email"] as? String
        self.profileImageUrl = dictionary["profileImageUrl"] as? String
    

【问题讨论】:

"[ setValue:forUndefinedKey:]:此类不符合键名的键值编码。"这是错误的重要部分。 User 的班级是什么?是UIView(Controller)吗?您是否有一个名为 name 的 IBOutlet 被您重命名为删除?你找到那个错误了吗? 放置一个调试器并尝试找出它崩溃的行。错误不在此代码中,而在其他地方。它说User 类与键name 的键值编码不兼容。 我以编程方式使用带有 MVC 概念的情节提要,所以我不使用情节提要。而 User 是一个类模型。基本上我不知道错误在哪里,因为没有任何错误 User 的课程是什么?它的超类是什么?你在某处有电话给name吗? 在用户类中我得到了这个代码:import UIKit class User: NSObject var id: String?变量名称:字符串? var 电子邮件:字符串? var profileImageUrl:字符串? init(dictionary: [String: AnyObject]) self.id = dictionary["id"] as? String self.name = dictionary["name"] as? String self.email = dictionary["email"] as?字符串 self.profileImageUrl = 字典 [“profileImageUrl”] 作为?字符串 【参考方案1】:

错误与此功能无关。堆栈跟踪表明您正在某处调用 KVC 方法 setValuesForKeys。有错误发生的地方。

要使类键值合规,您必须将@objc dynamic 属性添加到每个受影响的属性

class User: NSObject 
    @objc dynamic var id: String?
    @objc dynamic var name: String?
    @objc dynamic var email: String?
    @objc dynamic var profileImageUrl: String?

    init(dictionary: [String: AnyObject]) 
        self.id = dictionary["id"] as? String
        self.name = dictionary["name"] as? String
        self.email = dictionary["email"] as? String
        self.profileImageUrl = dictionary["profileImageUrl"] as? String
    

或者省略所有@objc 属性并在类前面添加@objcMembers

@objcMembers
class User: NSObject 
    dynamic var id: String?
    dynamic ...

基本上不鼓励您在 Swift 中使用这些 KVC 方法。

【讨论】:

所以我应该在我所有的类swift文件中添加'@objcMembers',并在我的所有函数中删除'@objc'? 否,如果指定了@objcMembers,则可以省略此类中(仅)属性的所有@objc 属性。我建议寻找没有 KVC 和 NSObject 继承类的原生 Swift 解决方案。 我终于明白你的意思了。我尝试了你的源代码,它的工作,我的应用程序不再崩溃。感谢您的回答@vadian

以上是关于获取 NSException 错误崩溃应用程序的主要内容,如果未能解决你的问题,请参考以下文章

获取核心数据,NSException错误

以未捕获的异常终止:NSException

Swift - 启动屏幕后游戏崩溃并且无法转换到 GameScene NSException 错误

在抛出“NSException”(gdb)的实例后调用终止

以 NSException Timer Swift Crash 类型的未捕获异常终止

NSKeyedUnArchiver 崩溃