2009-08-22 4 views
-1

J'ai de la mémoire qui est initialisée dans initWithCoder :. Je peux vérifier qu'avant la partie "return self" de initWithCoder la mémoire est initialisée.La mémoire initialisée dans initWithCoder est perdue dans drawView

J'allouent la mémoire à l'aide malloc et remplir à l'aide d'une fonction personnalisée:

// in initWithCoder: 
fontTexCoords = (GLfloat *)malloc(10 * 8 * sizeof(GLfloat)); 
[fontInfo textureCoordinatesToArray:fontTexCoords]; 
NSLog(@"%f", fontTexCoords[0]); // correctly outputs 1.0 

Cependant, dans ma routine de dessin, il semble que le contenu de cette mémoire a été remis à zéro:

// in drawView 
NSLog(@"%f", fontTexCoords[0]); // incorrectly outputs 0.0 

Je ne touche pas à la mémoire dans un autre endroit de mon application.

Question: pourquoi toutes les données sont-elles perdues? Quel processus entre initWithCoder et drawView va et fait des choses étranges à ma mémoire malloc?

Edit:

La sortie des 8 premiers flotteurs dans initWithCoder utilisant NSLog (@ "initWithCoder:% @% X% f", self, fontTexCoords, fontTexCoords [0 à 8]);

2009-08-22 21:25:15.220 Memory[32706:20b] initWithCoder: <EAGLView: 0xd19060; frame = (0 0; 320 480); autoresize = W+H; layer = <CAEAGLLayer: 0xd1b300>> D53110 0.000000 
2009-08-22 21:25:15.221 Memory[32706:20b] initWithCoder: <EAGLView: 0xd19060; frame = (0 0; 320 480); autoresize = W+H; layer = <CAEAGLLayer: 0xd1b300>> D53110 1.000000 
2009-08-22 21:25:15.222 Memory[32706:20b] initWithCoder: <EAGLView: 0xd19060; frame = (0 0; 320 480); autoresize = W+H; layer = <CAEAGLLayer: 0xd1b300>> D53110 0.000000 
2009-08-22 21:25:15.223 Memory[32706:20b] initWithCoder: <EAGLView: 0xd19060; frame = (0 0; 320 480); autoresize = W+H; layer = <CAEAGLLayer: 0xd1b300>> D53110 0.500000 
2009-08-22 21:25:15.223 Memory[32706:20b] initWithCoder: <EAGLView: 0xd19060; frame = (0 0; 320 480); autoresize = W+H; layer = <CAEAGLLayer: 0xd1b300>> D53110 0.500000 
2009-08-22 21:25:15.224 Memory[32706:20b] initWithCoder: <EAGLView: 0xd19060; frame = (0 0; 320 480); autoresize = W+H; layer = <CAEAGLLayer: 0xd1b300>> D53110 0.500000 
2009-08-22 21:25:15.224 Memory[32706:20b] initWithCoder: <EAGLView: 0xd19060; frame = (0 0; 320 480); autoresize = W+H; layer = <CAEAGLLayer: 0xd1b300>> D53110 0.500000 
2009-08-22 21:25:15.224 Memory[32706:20b] initWithCoder: <EAGLView: 0xd19060; frame = (0 0; 320 480); autoresize = W+H; layer = <CAEAGLLayer: 0xd1b300>> D53110 1.000000 

La sortie de drawView utilisant NSLog (@ "drawView:% @% X% f", self, fontTexCoords, fontTexCoords [0 à 8]);

2009-08-22 21:25:15.399 Memory[32706:20b] drawView: <EAGLView: 0xd19060; frame = (0 0; 320 480); autoresize = W+H; layer = <CAEAGLLayer: 0xd1b300>> D53110 0.000000 
2009-08-22 21:25:15.399 Memory[32706:20b] drawView: <EAGLView: 0xd19060; frame = (0 0; 320 480); autoresize = W+H; layer = <CAEAGLLayer: 0xd1b300>> D53110 0.000000 
2009-08-22 21:25:15.400 Memory[32706:20b] drawView: <EAGLView: 0xd19060; frame = (0 0; 320 480); autoresize = W+H; layer = <CAEAGLLayer: 0xd1b300>> D53110 0.000000 
2009-08-22 21:25:15.401 Memory[32706:20b] drawView: <EAGLView: 0xd19060; frame = (0 0; 320 480); autoresize = W+H; layer = <CAEAGLLayer: 0xd1b300>> D53110 0.000000 
2009-08-22 21:25:15.403 Memory[32706:20b] drawView: <EAGLView: 0xd19060; frame = (0 0; 320 480); autoresize = W+H; layer = <CAEAGLLayer: 0xd1b300>> D53110 0.000000 
2009-08-22 21:25:15.404 Memory[32706:20b] drawView: <EAGLView: 0xd19060; frame = (0 0; 320 480); autoresize = W+H; layer = <CAEAGLLayer: 0xd1b300>> D53110 0.000000 
2009-08-22 21:25:15.404 Memory[32706:20b] drawView: <EAGLView: 0xd19060; frame = (0 0; 320 480); autoresize = W+H; layer = <CAEAGLLayer: 0xd1b300>> D53110 0.000000 
2009-08-22 21:25:15.405 Memory[32706:20b] drawView: <EAGLView: 0xd19060; frame = (0 0; 320 480); autoresize = W+H; layer = <CAEAGLLayer: 0xd1b300>> D53110 0.000000 

Merci

+0

Une dernière chose, pouvez-vous ajouter "% X" et fontTexCoords lui-même à votre appel NSLog? 'NSLog (@"% @% X% f ", self, fontTexCoords, fontTexCoords [0]);' – Jason

+0

Bien sûr .. voir mon édition. Il semble que la mise à zéro soit aléatoire - parfois elle corrompt mes flotteurs avec des valeurs aléatoires. Quelque chose écrase quelque peu la mémoire. Je ne pense pas que ce soit moi, c'est le seul souvenir que je n'utilise pas. Je libère uniquement cette mémoire dans la méthode dealloc. – rein

+0

trouvé mon problème ... voir ma réponse ci-dessous. Merci Jason pour l'aide. – rein

Répondre

0

a trouvé le problème. C'était ma stupidité. Je libérais la mémoire dans la mauvaise méthode. D'une façon ou d'une autre j'ai mis le libre (fontTexCoords) dans layoutView au lieu de dealloc.

idiot, idiot me :)

1

Pouvez-vous changer vos appels NSLog d'inclure self dans la sortie? Puis confirmez que c'est la même vue qui est utilisée dans les deux endroits:

NSLog(@"%@ %f", self, fontTexCoords[0]); 
+0

Oui c'est le même objet – rein

Questions connexes