我在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
}
}
答案 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)
NSUserDefaults类提供了便于访问的方法 常见类型,例如浮点数,双精度数,整数,布尔值和URL。一个 默认对象必须是属性列表,即(或 对于集合的实例组合):NSData,NSString, NSNumber,NSDate,NSArray或NSDictionary。如果你想存储任何 在其他类型的对象中,通常应将其存档以创建 NSData的实例。
在Swift中你也可以使用:
Int
,UInt
,Double
,Float
和Bool
类型,因为它们会自动桥接到NSNumber
; String
桥接到NSString
[AnyObject]
因为它与NSArray
; [NSObject: AnyObject]
因为它与NSDictionary
桥接。 当然,数组元素和字典值的类型必须是以上类型之一。字典键类型必须为NSString
(或桥接String
)。
要存储任何其他类的实例,您有两个选择:
您的自定义类必须是NSObject
的子类并且符合
NSCoding
协议,然后您可以使用NSData
将此类的对象归档到NSKeyedArchiver.archivedDataWithRootObject()
,并将其保存到NSUserDefaults
,然后从NSUserDefaults
检索它并取消归档{ {1}}:
NSKeyedUnarchiver.unarchiveObjectWithData()
您可以将自定义对象属性保存到字典并存储
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