2014-03-04 3 views
14
-(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]; 
} 

오류 로그 :인식 할 수없는 선택기 인스턴스에 전송하는 동안 데이터를 보관 (NSCoding)

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

내가 객체를 보관하려고 할 때 "인식 할 수없는 선택기 인스턴스로 전송"어떻게해야합니까 왜 아무 생각이 없습니다.

+3

선택기는 무엇입니까? – trojanfoe

+0

콘솔에서 furnitureEncodedObject를 확인 했습니까 – morroko

+0

[NSKeyedArchiver archivedDataWithRootObject : 가구]; 여기 가구는 furniture.someobject이어야합니다 ... 한 번 시도하십시오 –

답변

34

당신은 당신의 가구 개체 내부 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; 
} 

은 기본적으로 당신이 작성 (인코딩)과 (디코딩) 파일에서 읽어야을 지정합니다. 대개 파일에 저장하려는 각 속성에 대해 내가 여기 예제에서 사용한 것과 동일하게 만듭니다.

+0

고마워!. 그 일은 나에게 좋았다. – Raja

3

NSKeyedArchiver으로 보관하려는 사용자 정의 클래스 Furniture이 있습니다. 이 작업을 수행하려면 Furniture 클래스가 <NSCoding> 프로토콜을 준수해야합니다. 이는 encodeWithCoder:initWithCoder: 방법을 구현하는 것을 의미합니다.

현재 이러한 방법을 구현하지 않습니다. 추가해야합니다.

1

가구 클래스가 NSCoding 프로토콜을 구현하지 않는다고 생각합니다.

5

당신은 NSCoding를 구현해야합니다 - 여기 두 개의 문자열 속성, tickernameSNStock라는 개체와 예입니다

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 
    } 
}