J'ai créé une classe "SDMutableGrid" afin que je puisse utiliser une grille. C'est juste un enfant de NSMutableArray qui contient un nombre de tableaux égal au nombre de lignes dans la grille.Problèmes d'héritage dans l'objectif C
Actuellement, le programme se ferme avant qu'il ne démarre réellement et il semble que c'est parce que les méthodes définies pour NSMutableArray ne s'appliquent pas à SDMutableGrid, quelqu'un sait pourquoi?
Voici le .h:
#import <Foundation/Foundation.h>
#import "SDDimensions.h"
@interface SDMutableGrid : NSMutableArray {
SDDimensions dimensions;
}
@property (nonatomic) SDDimensions dimensions;
- (id)initWithDimensions:(SDDimensions)newDimensions;
- (void)addObject:(id)anObject toRow:(NSUInteger)row;
@end
Voici le .m:
#import "SDMutableGrid.h"
@implementation SDMutableGrid
@synthesize dimensions;
- (void)setDimensions:(SDDimensions)newDimensions {
if (newDimensions.width < dimensions.width) {
NSMutableArray *anArray;
NSRange aRange = NSMakeRange(newDimensions.width, dimensions.width - newDimensions.width);
for (NSUInteger i = 0; i < MIN(dimensions.height,newDimensions.height); i++) {
anArray = [self objectAtIndex:i];
[anArray removeObjectsInRange:aRange];
}
}
dimensions.width = newDimensions.width;
if (newDimensions.height > dimensions.height) {
for (NSUInteger i = dimensions.height; i < newDimensions.height; i++) {
[self addObject:[[NSMutableArray alloc] initWithCapacity:dimensions.width]];
}
} else if (newDimensions.height < dimensions.height) {
[self removeObjectsInRange:NSMakeRange(newDimensions.height, dimensions.height - newDimensions.height)];
}
dimensions.height = newDimensions.height;
}
- (id)initWithDimensions:(SDDimensions)newDimensions {
if (self = [super initWithCapacity:newDimensions.height]) {
NSMutableArray *anArray;
for (NSUInteger i = 0; i < newDimensions.height; i++) {
anArray = [[NSMutableArray alloc] initWithCapacity:newDimensions.width];
NSLog(@"Got this far");
[self addObject:anArray];
NSLog(@"woot");
[anArray release];
}
NSLog(@"Finished Initializing grid");
}
return self;
}
- (void)addObject:(id)anObject toRow:(NSUInteger)row {
[[self objectAtIndex:row] addObject:anObject];
}
@end
Et voici ce qui apparaît sur la console:
2009-08-12 15: 27: 02.076 Flipswitch [1756: 20b] Fin de l'application en raison d'une exception non interceptée 'NSInvalidArgumentException', raison: ' - [NSMutableArray initWithCapacity:]: méthode uniquement définie pour la classe abstraite. Définir - [SDMutableGrid initWithCapacity:]! ' 12/08/2009 15: 27: 02,080 Flipswitch [1756: 20b] Stack: ( 807902715, 2536648251, 808283725, 808264737 , 13690, 11018, 10185 , 814713539, 814750709 , 814739251, 814722434, 814748641 , 839148405, 807687520 , 807683624, 814715661 , 814752238, 10052,)
+1 J'ajouterais que le premier exemple d'enveloppement d'un 'NSArray' dans une sous-classe de' NSObject' est appelé une classe ** composite ** –