2009-10-13 12 views
1

J'ai déjà répondu à la question suivante.Comment/où libérer des variables globales dans l'objectif c? -iphone

Objective C - Where do you dealloc global static variables?

Mais la question est liée aux variables statiques. Il a quelque chose de différent alors le mien.

J'ai le code suivant dans la demande.

//.h file 
#import "cocos2d.h" 
#import "something.h" 
#import "myLayer.h" 
#import "LayerData.h" 

// i have taken this variables as global 
// because two different classes are simultaneously accessing it 

myLayer *myCurrentLayer; 
LayerData *boxLayerData[10][12]; 

@interface one 
    // my class definition here 
@end 

@interface two 
    // my second class definition here 
@end 


//------------------------------------------------ 
@implementation one 
    // my class constructor here. 
    -(id)init{ 
     myCurrentLayer=[[myLayer alloc] init]; 
     // boxLayerData is initialized with objects 
    } 
@end 

@implementation two 
    // second class constructor 
    -(id)init{ 
     [myCurrentLayer setPosition:ccp(10,20)]; 
     [self schedule something for movements]; 
    } 
@end 
//------------------------------------------------ 

Ok. Une confusion est "comment libérer 120 size" LayerData * boxLayerData [10] [12]; "array?"

Plz. Donne une suggestion.

Merci d'avance.

Sagar.

Répondre

7

La même réponse s'applique au global comme à l'électricité statique. Si vous avez besoin des données pour l'ensemble du cycle de vie de l'application, laissez-le tel quel et la mémoire sera récupérée par le système d'exploitation à la fin de l'application. Si vous avez besoin de libérer l'objet pendant l'exécution de l'application, vous pouvez parcourir le tableau et appeler la publication sur chaque objet.

Quelque chose comme ceci:

for (int i = 0; i < 10; i++) 
{ 
    for (int j = 0; j < 12; j++) 
    { 
    LayerData *data = boxLayerData[i][j]; 
    [data release], data = nil; 
    } 
} 
+0

mais seulement quelques-uns d'entre eux sont alloués. comme un [5] [2] est alloué & un [3] [1] est alloué. si je mets une boucle pour ça, ce n'est pas correct. –

+0

Ok. Je pensais que c'est le seul moyen. Donc, finalement, j'ai suivi cette voie. –

+0

attention de vérifier qu'il y a un objet à un [n] [m]. – pxl

1

boxLayerData dans le code ci-dessus semble être un tableau de pointeurs. Alors que les pointeurs peuvent avoir besoin d'être gérés par certains moyens, le tableau qui stocke ces pointeurs n'a pas besoin d'être, et sera correctement éliminé à la fin de l'application.

+0

Yup! c'est un tableau de pointeurs. Il est créé au fur et à mesure que l'utilisateur commence un nouveau niveau. L'utilisateur peut annuler un niveau et redémarrer un niveau. Donc, il peut y avoir une énorme quantité de mémoire allouée. Mais je suis très confus dans la désallocation. –

2

vous êtes concerné par un utilisateur et le redémarrage d'un abandon niveau. Avez-vous envisagé de créer une classe singleton qui stockera toutes ces données stockées/partagées au lieu d'une globale? De cette façon, vous pouvez concevoir l'accès à ces données de sorte que vous n'écriviez pas de nouvelles données avant d'essayer ou d'accéder à quelque chose qui vient d'être désalloué, définissez si les éléments du tableau sont accédés atomiquement, assurez la sécurité des threads. .

+0

Yup! tu as raison. Je suis conscient de cela. Quand j'ai commencé le développement, j'avais juste une valeur unique pour le global. Tout en développant le jeu, lentement mes demandes pour le global ont augmenté. Enfin j'ai un tableau de 120 comme global. Je sais que ce n'est pas une bonne pratique. Mais en ce moment, pour moi, l'achèvement du jeu est important. J'ai donc posé une question ici si une autre solution disponible. –

+0

totalement comprendre. – pxl

Questions connexes