2009-04-05 6 views
0

J'essaie de rendre l'objet compatible NSTableDataSource et de donner cet objet à NSTableView en tant que DataSource, mais lorsque la table essaie d'afficher des données, elle plante.NSArray avec des objets personnalisés dans NSTableDataSource

@interface NSArrayDataSource : NSObject{ 
    NSArray* internalArray; 
} 
-(id) initWithArray: (NSArray*) objects; 
-(int)numberOfRowsInTableView:(NSTableView *)aTableView; 
-(id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex; 
-(void)tableView:(NSTableView *)aTableView setObjectValue:(id)anObject forTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex; 
@end 


@implementation NSArrayDataSource 

-(id) initWithArray: (NSArray*) objects{ 
    if(self = [super init]) 
    { 
     internalArray = [[NSArray alloc] initWithArray:objects]; 
    } 
    return self; 
} 

-(int)numberOfRowsInTableView:(NSTableView *)aTableView{ 
    return [internalArray count]; 
} 

-(id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex{ 
    id obj = [internalArray objectAtIndex:rowIndex]; 
     // when I debug, I get same pointers with invalid data 
     // each object has "name" message 
     // this following line gives invalid pointer and 
     // it crashes 
    return [obj name]; 
} 

-(void)tableView:(NSTableView *)aTableView setObjectValue:(id)anObject forTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex{ 
} 

@end 

Quelqu'un peut-il me dire quel pourrait être le problème?

À l'heure actuelle, j'ai supprimé tous les messages de release et de dealloc de ma classe, donc aucun objet n'est supprimé, j'ai fait conserver l'appel de message partout quand je transfère des données.

NSArrayDataSource* nsds = [[NSArrayDataSource alloc] initWithArray: myArray]; 
[tableView setDataSource:nsds]; 

je un doute, ne NSArray n'appelle [conserver] pour tous les objets tout en créant un nouvel objet ou il est tout simplement stocker des valeurs de pointeur? Supposons que le nom de mon objet est "SLProject" puis que je mette à jour les valeurs dans la fenêtre de débogage, mais dans la méthode de délégation tableView, le débogueur de internalArray affiche un objet de type "NSKVONotifying_SLProject" les adresses sont correctes.

Répondre

1

Ma première suspicion serait que la propriété -name NSString de la classe SLProject ne soit pas conservée. Il serait utile de connaître le message dans le journal de débogage qui décrit le crash car sans cela nous ne faisons que deviner. Comme pour le préfixe "NSKVONotifying_" sur votre nom de classe, au moment de l'exécution, Cocoa créera une sous-classe de votre objet lorsque vous utiliserez Key Value Observing. C'est normal et il est peu probable que ce soit la cause de votre problème.

+0

Merci, je lisais la valeur de xml, et j'avais utilisé la propriété de commodité et c'était autorelease, j'ai fait la copie et cela a commencé à fonctionner. Merci. –

1

En réponse à votre question sur la création d'objet NSArray, oui, chaque objet reçoit un message retain lorsqu'il est ajouté au tableau, et un message release lorsqu'il est supprimé. À partir des documents Apple:

En général, les objets que vous ajoutez à un tableau ne sont pas copiés; au contraire, chaque objet reçoit un message de conservation avant que son identifiant ne soit ajouté au tableau. Lorsqu'un objet est supprimé d'un tableau, il reçoit un message de libération.

En ce qui concerne la fonction de votre objet, comment est-elle implémentée? Si vous remplacez [obj name] par [obj description] cela plante-t-il toujours votre application?

+0

Si j'initialise un objet comme celui-ci ... SLProject * p = [[SLProject alloc] init]; Je n'ai pas spécifié ici autorelease, donc cela signifie que cet objet ne sera jamais désalloué à droite? que se passe-t-il si j'ajoute un tableau, et que ce tableau est supprimé, cet objet restera tel que je ne l'ai pas fait autorelease? –

+0

Merci pour votre aide, son fonctionnement maintenant. –

+0

En réponse à votre premier commentaire, il est courant de libérer un objet une fois qu'il a été ajouté à un tableau (le compte de retenue sera incrémenté puis décrémenté, sans effet net); Cela signifie que vous n'avez pas besoin de libérer les objets lorsque le tableau est. Sinon, il y aura une fuite de mémoire. –

Questions connexes