无法识别的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属性, ticker
和name
:
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协议。