2009-03-27 9 views
4

Je développe sur l'iPhone et il me manque quelque chose sur le stockage des objets dans un NSMutableArray - qu'est-ce que je fais mal et comment dois-je aborder cela?Problème de stockage des objets dans NSMutableArray

Les sections pertinentes de ce code sont

je un objet, une entité, définie qui hérite directement de NSObject. Dans ma classe GLView Je souhaite définir un tableau de ces - si GLView.h

@interface GLView : UIView 
{ 
    BOOL controllerSetup; 

    // Entity etc - first development task it to get one up 
    NSMutableArray *arrEntities; 
} 
@property(nonatomic, assign) NSMutableArray *arrEntities; 

et dans le corps dans la fonction drawView - qui est appelée plusieurs fois par un événement de minuterie - j'allouer le tableau et, pour développement initial, un seul objet entité et l'ajouter au tableau

- (void)drawView 
{ 
    if(!controllerSetup) { // initialize on first call 
     [controller setupView:self]; 
     controllerSetup = YES; 

     arrEntities = [NSMutableArray array]; 

     Entity* thisEntity = [[Entity alloc] initEntity]; 
     [arrEntities addObject:thisEntity]; 
    } 
    Entity *entity = [arrEntities objectAtIndex:0]; 
    [entity tickEntity:0.1]; 
} 

Je crois comprendre que le premier appel de drawView le NSMutableArray serait mis en place et l'instance de l'entité ajoutée, puis dans le corps du un pointeur vers la première copie de l'entité stockée dans le tableau récupéré et manipulé (évidemment, j'ai l'intention d'en ajouter d'autres et de les boucler l ater).

Cependant, ce qui se passe au premier appel de la procédure tout fonctionne bien, le objectAtIndex récupère le pointeur d'entité et tous les travaux. Cependant sur le deuxième appel lorsque controllerSetup est vrai et la clause d'initialisation non exécutée arrEntities est vide et le programme se bloque lorsque objectAtIndex récupère zéro.

Alors qu'est-ce que je fais mal? Pourquoi mon objet Entity stocké ne persiste-t-il pas dans NSMutableArray?

Répondre

8

Essayez de remplacer la ligne que vous créez arrEntities ce qui suit:

arrEntities = [[NSMutableArray alloc] init]; 

alors assurez-vous de l'ajouter à une méthode dealloc:

- (void)dealloc 
{ 
    [arrEntities release]; 
    [super dealloc]; 
} 

Fondamentalement, parce que vous n'êtes pas allouez explicity votre tableau (vous utilisez la méthode static + array), elle est autoeleased. Votre programme se bloque lorsque la baie a été libérée automatiquement et que votre code tente d'y accéder.

Encore une chose:

Entity* thisEntity = [[Entity alloc] initEntity]; 
[arrEntities addObject:thisEntity]; 
[thisEntity release]; // add this 

Si vous ne relâchez thisEntity, il fuira. addObject conserve l'objet transmis.

-1
Entity* thisEntity = [[Entity alloc] init]; 
[arrEntities addObject:thisEntity]; 
+1

Veuillez ne pas jeter du code. Vous devez expliquer ce que vous avez fait. C'est une mauvaise réponse. – arco444

+0

ok je m'en souviendrai la prochaine fois .... merci pour suggestion ... – Mak

Questions connexes