2012-03-29 4 views
2

내 앱에서 데이터를 저장하기 위해 인코딩을 처음 사용하고 있습니다. 지금까지 살펴본 예제에서는 [super encodeWithCoder:coder];에 맞춤 클래스를 호출한다고 말합니다.NSObject는 encodeWithCoder를 지원하지 않습니까?

나는 NSObject을 확장하지만 아래 오류 메시지가 표시됩니다. 이것은 NSObject이 기본 클래스이고 인코딩 할 것이 없기 때문에입니까?

메시지는 선택과 방법을 선언하지 않는 수신기 유형 'NSObject의'예를 들어

:

맞아
- (void)encodeWithCoder:(NSCoder *) coder 
{ 
[super encodeWithCoder:coder]; // <-------------------------ERROR 

[coder encodeInt:noteIndex forKey:@"noteIndex"]; 
[coder encodeCGRect:cellRect forKey:@"cellRect"]; 
[coder encodeBool:noteOn forKey: @"noteOn"]; 
[coder encodeInt:note forKey:@"note"]; 
[coder encodeInt:velocity forKey:@"velocity"]; 
[coder encodeInt:channel forKey:@"channel"]; 
[coder encodeInt:releaseVelocity forKey:@"releaseVelocity"]; 
[coder encodeFloat:duration forKey:@"duration"]; 
} 

답변

10

, NSObjectNSCoding에 적합하지 않기 때문에하지 않는 'encodeWithCoder' encodeWithCoder:을 구현하십시오.

- (void)encodeWithCoder:(NSCoder *) coder 
{ 
    [coder encodeInt:noteIndex forKey:@"noteIndex"]; 
    [coder encodeCGRect:cellRect forKey:@"cellRect"]; 
    [coder encodeBool:noteOn forKey: @"noteOn"]; 
    [coder encodeInt:note forKey:@"note"]; 
    [coder encodeInt:velocity forKey:@"velocity"]; 
    [coder encodeInt:channel forKey:@"channel"]; 
    [coder encodeInt:releaseVelocity forKey:@"releaseVelocity"]; 
    [coder encodeFloat:duration forKey:@"duration"]; 
} 

을 그리고 당신의 initWithCoder:은과 같습니다 : 다행히도, NSObject 자체가 그래서 당신이해야 할 것입니다, 인코딩에 데이터가없는

- (id)initWithCoder:(NSCoder *)decoder { 
    if (self = [super init]) { 
     self.noteIndex = [decoder decodeIntForKey:@"noteIndex"]; 
     // and so on 
    } 
    return self; 
} 
+0

멋진 - 감사합니다. –

+0

개체를 인스턴스화 할 때 'initWithCode : (NSCoder *) decoder'를 명시 적으로 호출해야합니까? 그렇다면 '디코더'에 대해 무엇을 전달합니까? – greenhouse

+0

nevermind, 나는 테스트를 했으므로 명시 적으로 호출하지 않아도됩니다. 감사합니다! – greenhouse

관련 문제