3 votes

Les sous-classes Obj-C ne semblent pas reconnaître les sélecteurs hérités.

Tout d'abord, mon code :

@interface Block : NSObject {
    NSData *data;
    NSInteger slice_count;
}

@property (readonly) NSData *data;

+ (Stopwatch *) runOldTestsUsingConfiguration:(TestConfiguration *)c;

- (Slice *) getSlice:(NSUInteger)idx;

@end

- (Slice *) getSlice:(NSUInteger)idx {
    void *b = (void*)[data bytes] + idx*slice_count;
    int len = [data length] / slice_count;
    Slice *ret = [Slice alloc];
    [ret initWithBytesNoCopy:b length:len freeWhenDone:NO];
    return ret;
    //NSString *temp2 = [data description];
    //NSRange r = NSMakeRange(idx*slice_count, [data length] / slice_count);
    //NSData *d = [data subdataWithRange:r];
    //NSString *temp = [d description];
    //Slice *s = [[Slice alloc] initWithBytesNoCopy:(void *)[d bytes] length:r.length freeWhenDone:NO];
    //return s;
}

donde Slice est une sous-classe simple de NSData .

Pour une raison quelconque, je reçois une erreur d'exécution qui semble indiquer que mon instance Slice a) n'est pas réellement une instance concrète ( ?) ou b) quelque chose ne va pas dans son héritage et le message ne se lie pas correctement à Slice (presque certainement par mon erreur encore inconnue).

L'erreur exacte que je reçois est la suivante :

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '***
initialization method -initWithBytes:length:copy:freeWhenDone:bytesAreVM:
cannot be sent to an abstract object of class Slice: Create a concrete instance!'

Quelqu'un peut-il m'aider ? J'ai essayé à peu près tout ce à quoi je peux penser (les routines de base sont détaillées dans l'appel du message lui-même) et je n'ai toujours rien trouvé. Que signifie l'expression "créer une instance concrète" ? N'est-ce pas ce que je fais lorsque je alloc ça ?

4voto

Dan F Points 11380

La sous-classification de NSData est beaucoup plus compliquée que vous ne le pensez. Dans la plupart des cas, il est préférable d'écrire une enveloppe autour de NSData plutôt qu'une sous-classe complète.

1voto

ctrahey Points 12360

IIRC, les méthodes init sont autorisées à réassigner self, et devraient donc TOUJOURS être utilisées sur la même ligne que alloc.

Slice *ret = [[Slice alloc] initWithBytesNoCopy:b length:len freeWhenDone:NO];

Je ne suis pas sûr que ce soit la cause première, mais c'est un signal d'alarme qui peut vous mettre sur la bonne voie.

EDIT :

En fait, je me demande si vous avez surchargé +alloc dans votre sous-classe et si vous ne renvoyez pas une instance...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X