无法识别的select器在归档数据时发送到实例(NSCoding)

-(void)transformObjects:(NSMutableArray*)array key:(NSString*)key { NSMutableArray* archiveArray = [[NSMutableArray alloc]initWithCapacity:array.count]; for (Furniture *furniture in array) { // The error occurs on the line below NSData *furnitureEncodedObject = [NSKeyedArchiver archivedDataWithRootObject:furniture]; [archiveArray addObject:furnitureEncodedObject]; } NSUserDefaults *userData = [NSUserDefaults standardUserDefaults]; [userData setObject:archiveArray forKey:key]; } 

错误日志:

 2014-03-04 10:55:27.881 AppName[10641:60b] -[Furniture encodeWithCoder:]: unrecognized selector sent to instance 0x15d43350 

我不知道为什么当我尝试归档一个对象时,“无法识别select器发送到实例”。

你需要在你的Furniture对象中实现NSCoding协议:

 - (void)encodeWithCoder:(NSCoder *)aCoder{ [aCoder encodeObject:self.yourpoperty forKey:@"PROPERTY_KEY"]; } -(id)initWithCoder:(NSCoder *)aDecoder{ if(self = [super init]){ self.yourpoperty = [aDecoder decodeObjectForKey:@"PROPERTY_KEY"]; } return self; } 

基本上你指定了什么应该写(编码)和从文件中读取(解码)。 通常对于你想存储在一个文件中的每个属性,你可以像我在这个例子中做的一样。

你需要实现NSCoding – 这里有一个叫做SNStock的对象,它有两个string属性, tickername

 import Foundation class SNStock: NSObject, NSCoding { let ticker: NSString let name: NSString init(ticker: NSString, name: NSString) { self.ticker = ticker self.name = name } //MARK: NSCoding required init(coder aDecoder: NSCoder) { self.ticker = aDecoder.decodeObjectForKey("ticker") as! NSString self.name = aDecoder.decodeObjectForKey("name") as! NSString } func encodeWithCoder(aCoder: NSCoder) { aCoder.encodeObject(ticker, forKey: "ticker") aCoder.encodeObject(name, forKey: "name") } //MARK: NSObjectProtocol override func isEqual(object: AnyObject?) -> Bool { if let object = object as? SNStock { return self.ticker == object.ticker && self.name == object.name } else { return false } } override var hash: Int { return ticker.hashValue } } 

你有一个自定义类的Furniture ,你正试图存档与NSKeyedArchiver 。 为了使这个工作, Furniture类需要符合< NSCoding >协议。 这意味着实现encodeWithCoder:initWithCoder:方法。

目前你不实现这些方法。 你需要添加它们。

我认为你的家具类没有实现NSCoding协议。