所以我有一系列自定义对象。当我尝试将阵列保存到NSUserDefaults时,我必须将它们存档。以下是我要归档自定义对象数组的内容:
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
//3
var allMessages = defaults.objectForKey(UserDefaultsMesssageKey) as! [AddMessageViewController.harassText]
var aMessage = AddMessageViewController.harassText(phoneNumber: 0, message: "1", frequency: 1, active: 1)
allMessages.append(aMessage)
saveMessage(allMessages)
return (allMessages.count)
}
func archiveMessage(message:[AddMessageViewController.harassText]) -> NSData {
let archivedObject = NSKeyedArchiver.archivedDataWithRootObject(message as NSArray)
return archivedObject
}
func saveMessage(messages: [AddMessageViewController.harassText]) {
let archivedObject = archiveMessage(messages)
defaults.setObject(archivedObject, forKey: UserDefaultsMesssageKey)
defaults.synchronize()
}
func retrieveData()-> [AddMessageViewController.harassText]? {
if let unarchiveObject = NSUserDefaults.standardUserDefaults().objectForKey(UserDefaultsMesssageKey) as? NSData {
return NSKeyedUnarchiver.unarchiveObjectWithData(unarchiveObject) as? [AddMessageViewController.harassText]
}
return nil
}
流程是:
在saveMessage调用中,传递自定义数组以获取存档。这是数组对GDB的看法。你可以看到它是一个数组,它包含1个类对象。
([Harass_Your_Kate.AddMessageViewController.harassText]) $R0 = 1 value {
[0] = 0x00007fa5ab409600 {
ObjectiveC.NSObject = {
isa = Harass_Your_Kate.AddMessageViewController.harassText
}
phoneNumber = 0
message = "1"
frequency = 1
active = 1
}
}
数组传递给archiveMessage。代码在NSKeyedArchiver方法上立即失败。错误消息如下:
[_TtCC16Harass_Your_Kate24AddMessageViewController10harassText encodeWithCoder:]: unrecognized selector sent to instance 0x7fa5ab409600
2016-07-15 16:31:26.019 Harass Your Kate [5858:7847495] * - [NSKeyedArchiver dealloc]:警告:NSKeyedArchiver在没有调用-finishEncoding的情况下取消分配。 2016-07-15 16:31:26.023骚扰你的凯特[5858:7847495] * 由于未捕获的异常终止应用程序' NSInvalidArgumentException',原因:' - [_ TtCC16Harass_Your_Kate24AddMessageViewController10harassText encodeWithCoder:] :无法识别的选择器发送到实例0x7fa5ab409600
我感谢所有的帮助,提前谢谢你!
编辑:这是我的对象的定义:
class Text : NSObject {
var phoneNumber = 0 //Text address to send to
var message: String = "" //Message to be sent
var frequency = 24 //Number of hours between messages (usually a multiple of 24 - 24 = daily)
var active = 0 // 0 if cancelled, 1 if active
init(phoneNumber: Int, message: String, frequency: Int, active: Int ){
self.phoneNumber = phoneNumber
self.message = message
self.frequency = frequency
self.active = active
}
}
答案 0 :(得分:3)
SELECT A.ID#, C.Customer, E.EventID#
INTO #TEMP
FROM IDTable A
INNER JOIN CustomerTable C
ON C.AccountID = A.AccountID
INNER JOIN EventTable E
ON E.AccountType = C.AccountType
WHERE C.StatusID = 'Active'
;
SELECT A.ID#, A.Customer, A.EventID#
FROM #TEMP A
INNER JOIN #TEMP A2 ON A.Customer = A2.Customer
AND A.EventID# = A2.EventID#
AND A.ID# <> A2.ID#
通过利用您必须通过符合NSKeyedArchiver
协议提供的方法来序列化对象。它无法自动推断如何保存自定义类;你必须自己实现如下:
NSCoding
如您所见,初始化程序从编码器读取并创建和实例,而class Text : NSObject, NSCoding {
var phoneNumber = 0 //Text address to send to
var message: String = "" //Message to be sent
var frequency = 24 //Number of hours between messages (usually a multiple of 24 - 24 = daily)
var active = 0 // 0 if cancelled, 1 if active
init(phoneNumber: Int, message: String, frequency: Int, active: Int ){
self.phoneNumber = phoneNumber
self.message = message
self.frequency = frequency
self.active = active
}
required init?(coder aDecoder: NSCoder) {
phoneNumber = aDecoder.decodeInteger(forKey: "phoneNumber")
message = aDecoder.decodeObject(forKey: "message") as! String
frequency = aDecoder.decodeInteger(forKey: "frequency")
active = aDecoder.decodeInteger(forKey: "active")
}
func encode(with aCoder: NSCoder) {
aCoder.encode(phoneNumber, forKey: "phoneNumber")
aCoder.encode(message, forKey: "message")
aCoder.encode(frequency, forKey: "frequency")
aCoder.encode(active, forKey: "active")
}
}
方法将相关信息保存到编码器。在像这样的简单类中,它们的实现可能看起来很明显,但在更复杂的自定义类型中,要做出非平凡的编码决策。