import UIKitenum UserType { case terant // case normalUser // case normalUserFinancialer // }@objc(UserStaticSwift)class UserStaticSwift:NSObject,NSCoding {
报告的错误:
使用控制台日志:
libc++abi.dylib: terminating with uncaught exception of type NSException
在编码中:
func encode(with aCoder: NSCoder) { /* 基础 */ aCoder.encode(islogin,forKey: "islogin") aCoder.encode(type!,forKey: "type") // crash here in real device aCoder.encode(forOcType,forKey: "forOcType") aCoder.encode(username,forKey: "username") aCoder.encode(password,forKey: "password") aCoder.encode(userID,forKey: "userID")
这里的代码我归档了我的userStatic:
userStatic.addUserInfo(type: userStatic.type!,dic: userInfoDic,closure: { (voID) in // success then archive `userStatic` let paths:NSArray = NSSearchPathForDirectorIEsInDomains(.documentDirectory,.userDomainMask,true) as NSArray let path = paths.firstObject let homePath = "\(path)/\(Global.archive_userStaticdata)" let _ = NSKeyedArchiver.archiveRootObject(userStatic,tofile: homePath) })
我在archiveRootObject时调试:
控制台日志:
(lldb) po NSSearchPathForDirectorIEsInDomains(.documentDirectory,true) as NSArrayerror: Couldn't materialize: Couldn't get the value of voID: extracting data from value Failederror: errored out in DoExecute,Couldn't PreparetoExecuteJITExpression(lldb) po homePatherror: Couldn't materialize: Couldn't get the value of voID: extracting data from value Failederror: errored out in DoExecute,Couldn't PreparetoExecuteJITExpression
我已经在模拟器和设备中进行了测试,在模拟器中问题不存在,在实际设备中问题就出来了.
解决方法 试试这个问题吧func encode(with aCoder: NSCoder) { aCoder.encode(type.rawValue,forKey: "type")}
欲获得更多信息
让我们详细讨论这个问题
例如,这是我的枚举:
enum PIEceType : Int { case empty case notEmpty}
这是我的对象,它是NSObject的孩子
class PIEce: NSObject,NSCoding { var islogin: Bool var type: PIEceType var username: String! var password: String! overrIDe init() { islogin = false type = PIEceType.empty username = "" password = "" } required init(coder aDecoder: NSCoder) { islogin = aDecoder.decodeBool(forKey: "islogin") type = PIEceType(rawValue: aDecoder.decodeObject(forKey: "type") as! Int)! username = aDecoder.decodeObject(forKey: "username") as! String password = aDecoder.decodeObject(forKey: "password") as! String } func encode(with aCoder: NSCoder) { aCoder.encode(islogin,forKey: "islogin") aCoder.encode(type.rawValue,forKey: "type") aCoder.encode(username,forKey: "username") aCoder.encode(password,forKey: "password") }}
当您调用NSKeyedArchiver.archiveRootObject(::)时,它将调用func编码(使用aCoder:NSCoder)方法并将您的NSObject转换为数据当您尝试取消归档对象时,它将调用init(coder aDecoder:NSCoder)方法并转换数据使用Key到NSObject.
但是在Enum的情况下你不能直接编码枚举B’Coz它是用户定义数据类型但是rawValue必须是内置数据类型,如Int,String,float …..所以.
这就是为什么当你尝试编码枚举时,你需要使用rawValue
我希望你能得到点.
总结以上是内存溢出为你收集整理的ios – 当func编码中的归档对象(使用aCoder:NSCoder)方法在真实的revice中使用swift enum崩溃全部内容,希望文章能够帮你解决ios – 当func编码中的归档对象(使用aCoder:NSCoder)方法在真实的revice中使用swift enum崩溃所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)