2012-03-29 7 views
2

J'utilise l'encodage pour la première fois afin de sauvegarder les données de mon application. Les exemples que j'ai regardés disent d'appeler [super encodeWithCoder:coder]; pour les classes personnalisées.NSObject ne prend pas en charge encodeWithCoder?

J'ai une classe qui s'étend NSObject mais j'obtiens le message d'erreur ci-dessous. Est-ce parce que NSObject est la classe de base et n'a rien à coder?

type de récepteur 'NSObject', par exemple, un message ne déclare pas une méthode avec le sélecteur 'encodeWithCoder:'

- (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"]; 
} 

Répondre

10

C'est vrai, NSObject ne sont pas conformes à NSCoding, il ne mettre en œuvre encodeWithCoder:. Heureusement, NSObject lui-même n'a pas de données à encoder, tout ce que vous avez à faire est:

- (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"]; 
} 

Et votre initWithCoder: serait tout simplement ressembler à:

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

génial - merci. –

+0

devez-vous maintenant appeler explicitement 'initWithCode: (NSCoder *) decoder' lors de l'instanciation de l'objet? Si oui, que faites-vous passer pour 'décodeur'? – greenhouse

+0

peu importe, j'ai testé et vous ne devez pas explicitement l'appeler, merci! – greenhouse

Questions connexes