代码之家  ›  专栏  ›  技术社区  ›  Sener

libc++abi。dylib:以NSException Alamofire类型的未捕获异常终止

  •  1
  • Sener  · 技术社区  · 7 年前

    我正在使用alamofire向服务器发送图像。If参数;

        let parameters: Parameters = [
            "userID": "1",
            "acToken": "acToken"
        ]
    

    工作但参数;

        let parameters: Parameters = [
            "userID": userID,
            "acToken": acToken ?? ""
        ]
    

    不工作。错误=libc++abi。dylib:以NSException类型的未捕获异常终止

    我使用的是swift4、alamofire 4、Xcode 9.2

    我的上载方法:

    func profilePhotoUpload(){
            let defaults = UserDefaults.standard
            let userID = defaults.integer(forKey: "userID")
            let acToken = defaults.string(forKey: "acToken")
            print("\(userID) - \(acToken ?? "")")
    
                // add UI related changes here
                let image = self.profilePhoto.image
    
                let parameters: Parameters = [
                    "userID": userID,
                    "acToken": acToken ?? ""
                ]
    
                Alamofire.upload(multipartFormData: { (multipartFormData) in
                    multipartFormData.append(UIImageJPEGRepresentation(image!, 1)!, withName: "photo_path", fileName: "swift_file.jpeg", mimeType: "image/jpeg")
                    for (key, value) in parameters {
                        multipartFormData.append((value as AnyObject).data(using: String.Encoding.utf8.rawValue)!, withName: key)
                    }
                }, to:"http......")
                { (result) in
                    switch result {
                    case .success(let upload, _, _):
    
                        upload.uploadProgress(closure: { (progress) in
                            //Print progress
                        })
    
                        upload.responseJSON { response in
                            print(response.result)
                            //print response.result
                        }
    
                    case .failure(let encodingError):
                        print(encodingError.localizedDescription)
                        break
                        //print encodingError.description
                    }
                }
        }
    

    错误日志:

    VoiceStage[33099:1632858]-[ NSCFNumber DATAUSINGENCODE:]:发送到实例0xb000000000000013的无法识别的选择器 2018-03-26 16:20:16.686009+0300 VoiceStage[33099:1632858]***由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[\u NSCFNumber dataUsingEncoding:]:发送到实例0xb000000000000013的无法识别的选择器” ***第一次抛出调用堆栈: ( 0 CoreFoundation 0x000000010520f12b \u异常预处理+171 1 libobjc。A、 dylib 0x00000001048a3f41 objc\u exception\u throw+48 2 CoreFoundation 0x0000000105290024-[NSObject(NSObject)不识别选择器:]+132 3 CoreFoundation 0x0000000105191f78 \uuuuu转发_ +1432年 4 CoreFoundation 0x0000000105191958 \u CF\u forwarding\u prep\u 0+120 5 VoiceStage 0x0000000103d09a7a T010VoiceStage27 ProfileDetailViewControllerC18ProfilePhotouploadyyyfy9Alamofire17MultipartFormDataCCFU +1354年 6 VoiceStage 0x0000000103d0f9a4 \u T010VoiceStage27 ProfileDetailViewControllerc18 ProfilePhotouploadyyfy9AlaMofire17多部件数据CCFU\u TA+84 7 Alamofire 0x000000010415a994 \u T09Alamofire14会话管理器6上载YYAA17多部分格式数据CC09MultipartFG0\u s6uint64 v14使用ResholdAA21URLRestConvertible\u p4将编码结果保存到SG18编码完成TFYYCFU+212 8 Alamofire 0x000000010415e2bc \u T09Alamofire14会话管理器6上传YYAA17多部分格式数据CC09MultipartFG0\u s6uint64 v14使用ResholdAA21UrlRequestConvertible\u p4,编码结果为SG18编码完成TFYYCFU+156 9 Alamofire 0x00000001040e0599 \u T0Ix\u IyB\u TR+41 10 libdispatch。dylib 0x000000010a10d2f7 \u dispatch\u call\u block\u and\u release+12 11 libdispatch。dylib 0x000000010a10e33d \u dispatch\u client\u callout+8 12 libdispatch。dylib 0x000000010a11a3a2 \u dispatch\u root\u queue\u drain+1444 13 libdispatch。dylib 0x000000010a119da0 \u调度\u工作线程3+132 14 libsystem\u pthread。dylib 0x000000010a5d41ca \u pthread\u wqthread+1387 15 libsystem\u pthread。dylib 0x000000010a5d3c4d start\u wqthread+13 ) libc++abi。dylib:以NSException类型的未捕获异常终止 (lldb)

    1 回复  |  直到 7 年前
        1
  •  2
  •   Larme    7 年前
    -[NSCFNumber dataUsingEncoding:]: unrecognized selector sent to instance
    

    错误消息是:我试图调用一个方法 dataUsingEncoding: (Objective-C版本一),即Swift data(using:) NSNumber 对象我不能,我崩溃了。 这意味着在某个时候,你认为你在使用 String 对象,而实际上它是 Number 一个(或转换为 数字 来自 Int )。

    multipartFormData.append((value as AnyObject).data(using: String.Encoding.utf8.rawValue)!, withName: key)
    

    你认为 value 响应 数据(使用:) 。 事实上,应该更多 (value as String) 。 管理更多案例将是测试 价值 。如果是字符串对象,请使用 数据(使用:) ,如果它已经是 Data 对象简单放置 价值

    在伪代码中:

    let valueToSet;
    if value is a String Object {
       valueToSet = (value as String).data(using:.utf8)
    } else if value is a Data Object {
       valueToSet = value
    } else if value is a Number Object {
       valueToSet = String(initWithNumber:value).data(using:.utf8)
    } else ... ?
    
        multipartFormData.append(valueToSet, withName: key)
    

    您还可以写:

    let parameters: Parameters = [
        "userID": userID,
        "acToken": acToken ?? ""
    ]
    

    因此,在对错误进行了所有这些解释之后: userID 不是字符串或 acToken 不是字符串而是 内景 。根据名字,我倾向于这样说 用户ID 是一个 内景