尝试向NSUserDefaults添加元素时App Appate奇怪的错误

时间:2015-09-26 15:41:17

标签: swift nsuserdefaults swift2 sigabrt

我在Xcode 7(Swift 2)上运行我的应用程序时出现了一个非常奇怪的错误,该应用程序在我的应用程序的App Delegate类中显示“Thread 1:signal SIGABRT”运行错误消息。但是我实际上已经在App Delegate类中多次运行这个“线程1:信号SIGABRT”错误消息,主要是在我的代码中删除插座引用而忘记从故事板中删除它时。但这肯定是我第一次在尝试发出命令时遇到同样的错误:

let wasteGain = WastesGainsClass(value: enteredMoney, originOrCat: segControlArray[segControl.selectedSegmentIndex], specification: plusEspecTField.text!, date: dateArray, mode: "gain")

gains.append(wasteGain)

NSUserDefaults.standardUserDefaults().setObject(gains, forKey: "gains")

如果我只是对NSUserDefaults.standardUserDefaults().setObject(gains, forKey: "gains")行发表评论,该应用不会崩溃!所以错误可能就在那一行。

如果有人能帮助我,我会非常感谢你。

PS:WastesGainsClass格式是这样的:

class WastesGainsClass {

    var value:Int = 0
    var origin:String
    var specification:String
    var date:[String]
    var mode:String
    var rowMode:Int = 0

    init(value:Int, originOrCat:String, specification:String, date:[String], mode:String) {

        self.value = value
        self.origin = originOrCat
        self.specification = specification
        self.date = date
        self.mode = mode

    }

}

3 个答案:

答案 0 :(得分:1)

遗憾的是,

class Testing{ static int count = 0; public Testing(){ count++; } public static void main(String[] args){ Testing[] testObjects= new Testing[20]; for(int i = 1; i<20;i++){ if(Testing.count==5){ System.out.println("5 objects are created.. Can't create anymore, although 20 objects can be stored"); System.exit(0); } else{ testObjects[i] = new Testing(); System.out.println("Object "+Testing.count+" is created."); } } // for loop close System.out.println("Program will exit"); } } 不能接受任意对象,只能接受可以在属性列表中编码的对象。请参阅Apple's reference guide for Property Lists以了解可以存储哪些对象。

如果您需要保存多个NSUserDefaults个对象,您可能希望编写一个方法,该方法返回WastesGainsClass编码其属性列表可表示的属性,以及一个接受此类Dictionary的初始值设定项恢复对象。

但是,如果您真的需要保存多个这样的自定义对象,您可能根本不想使用Dictionary。考虑一个基于文档的应用程序,并查看NSUserDefaults

答案 1 :(得分:1)

来自documentation

  

NSUserDefaults类提供了便于访问的方法   常见类型,例如浮点数,双精度数,整数,布尔值和URL。一个   默认对象必须是属性列表,即(或   对于集合的实例组合):NSData,NSString,   NSNumber,NSDate,NSArray或NSDictionary。如果你想存储任何   在其他类型的对象中,通常应将其存档以创建   NSData的实例。

在Swift中你也可以使用:

  • IntUIntDoubleFloatBool类型,因为它们会自动桥接到NSNumber;
  • String桥接到NSString
  • [AnyObject]因为它与NSArray;
  • 桥接
  • [NSObject: AnyObject]因为它与NSDictionary桥接。

当然,数组元素和字典值的类型必须是以上类型之一。字典键类型必须为NSString(或桥接String)。

要存储任何其他类的实例,您有两个选择:

  1. 您的自定义类必须是NSObject的子类并且符合 NSCoding协议,然后您可以使用NSData将此类的对象归档到NSKeyedArchiver.archivedDataWithRootObject(),并将其保存到NSUserDefaults,然后从NSUserDefaults检索它并取消归档{ {1}}:

    NSKeyedUnarchiver.unarchiveObjectWithData()
  2. 您可以将自定义对象属性保存到字典并存储 import Foundation class WastesGainsClass: NSObject, NSCoding { var value: Int init(value: Int) { self.value = value } required init(coder aDecoder: NSCoder) { value = aDecoder.decodeObjectForKey("value") as! Int } func encodeWithCoder(aCoder: NSCoder) { aCoder.encodeObject(value, forKey: "value") } } var gains = [WastesGainsClass(value: 1), WastesGainsClass(value: 2)] NSUserDefaults.standardUserDefaults().setObject(gains.map { NSKeyedArchiver.archivedDataWithRootObject($0) }, forKey: "gains") if let gainsData = NSUserDefaults.standardUserDefaults().objectForKey("gains") as? [NSData] { gains = gainsData.map { NSKeyedUnarchiver.unarchiveObjectWithData($0) as! WastesGainsClass } } 中的词典:

    NSUserDefaults

答案 2 :(得分:0)

您发布的代码尝试将一组自定义对象保存到NSUserDefaults。你不能这样做。实现NSCoding方法没有帮助。您只能在NSUserDefaults中存储NSArray,NSDictionary,NSString,NSData,NSNumber和NSDate等内容。

您需要将对象转换为NSData(就像在某些代码中一样)并将NSData存储在NSUserDefaults中。如果需要,您甚至可以存储NSData的NSArray。

请参阅此帖子:Attempt to set a non-property-list object as an NSUserDefaults