2010-04-26 7 views
0

J'ai un problème, je ne peux pas le résoudre, juste erreur de réception:Problème de fuite de mémoire. iPhone SDK

Programme reçu le signal: "0". Le débogueur s'est fermé en raison du signal 10 (SIGBUS). Le débogueur s'est fermé en raison du signal 10 (SIGBUS).

Voici une méthode, si je la mettre en commentaire, problème va aways

- (void)loadTexture { 
    const int num_tex = 10; 
    glGenTextures(num_tex, &textures[0]); 

    //TEXTURE #1 
    textureImage[0] = [UIImage imageNamed:@"wonder.jpg"].CGImage; 
      //TEXTURE #2 
    textureImage[1] = [UIImage imageNamed:@"wonder.jpg"].CGImage; 
    //TEXTURE #3 
    textureImage[2] = [UIImage imageNamed:@"wall_eyes.jpg"].CGImage; 
    //TEXTURE #4 
    textureImage[3] = [UIImage imageNamed:@"wall.jpg"].CGImage; 
    //TEXTURE #5 
    textureImage[4] = [UIImage imageNamed:@"books.jpg"].CGImage; 
    //TEXTURE #6 
    textureImage[5] = [UIImage imageNamed:@"bush.jpg"].CGImage; 
    //TEXTURE #7 
    textureImage[6] = [UIImage imageNamed:@"mushroom.jpg"].CGImage; 
    //TEXTURE #8 
    textureImage[7] = [UIImage imageNamed:@"roots.jpg"].CGImage; 
    //TEXTURE #9 
    textureImage[8] = [UIImage imageNamed:@"roots.jpg"].CGImage; 
    //TEXTURE #10 
    textureImage[9] = [UIImage imageNamed:@"clean.jpg"].CGImage; 

    for(int i=0; i<num_tex; i++) { 
     NSInteger texWidth = CGImageGetWidth(textureImage[i]); 
     NSInteger texHeight = CGImageGetHeight(textureImage[i]); 
     GLubyte *textureData = (GLubyte *)malloc(texWidth * texHeight * 4); 

     CGContextRef textureContext = CGBitmapContextCreate(textureData, 
        texWidth, texHeight, 
        8, texWidth * 4, 
        CGImageGetColorSpace(textureImage[i]), 
        kCGImageAlphaPremultipliedLast); 
     CGContextDrawImage(textureContext, CGRectMake(0.0, 0.0, (float)texWidth, (float)texHeight), textureImage[i]); 
     CGContextRelease(textureContext); 

     glBindTexture(GL_TEXTURE_2D, textures[i]); 
     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texWidth, texHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, textureData); 

     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 

     free(textureData); 
    } 
} 

quelqu'un peut me aider à libérer/supprimer des objets dans cette méthode? Merci.

+0

étape par la méthode. Sur quelle ligne l'erreur se produit-elle? –

+0

il se produit sur le redémarrage 3-ème du jeu, donc, sur le troisième (parfois 4-ème) temps iPhone juste fermer mon application. il me semble qu'il y a une énorme fuite de mémoire cachée ici – x0661t

+0

Je ne vois aucune fuite de mémoire. – shosti

Répondre

0

[UIImage imagenamed:] crée souvent des fuites de mémoire. J'ai eu un problème similaire et l'ai corrigé en utilisant la méthode trouvée here. Fondamentalement, vous voulez utiliser quelque chose comme ceci:

NSString *fileName = [NSString stringWithFormat: @"%@/Image.png", [[NSBundle mainBundle] resourcePath]]; 
UIImage *tmp = [[UIImage alloc] initWithContentsOfFile: fileName]; 
CGImageRef cg = [tmp CGImage]; 
[tmp release]; 
//Do stuff 
CGImageRelease(cg); 
+0

merci, va essayer! – x0661t

+0

textureImage [0] = [[UIImage alloc] initWithContentsOfFile: nomFichier]; cette ligne provoquant un avertissement: affectation à partir d'un type de pointeur incompatible. btw, textureImage est de type CGImageRef. – x0661t

+1

Quel système d'exploitation voyez-vous des fuites sous BigJason? Avez-vous signalé cela à Apple? –

0

Avez-vous essayé d'accéder à des éléments du tableau textureImage en dehors du contexte de cette méthode?

Les éléments de ce tableau sont alloués et libérés par imageNamed :, mais il semble que textureImage soit défini en dehors de la méthode. Si vous essayez d'appeler une méthode sur l'une des images de ce tableau plus tard, vous verrez l'erreur que vous voyez.

Si vous avez besoin des éléments de la matrice ailleurs, veillez à conserver les objets CGImage ou UIImage ici, puis relâchez-les lorsque vous avez terminé.

+0

Salut, je ne cherche pas à accéder à un élément de textureImage en dehors de cette méthode. – x0661t

+0

peut-être que je dois utiliser glDeleteTextures() dans la méthode dealloc? Je ne peux pas comprendre comment l'utiliser :( – x0661t

0

pour tous ceux qui auront un tel problème, il suffit de relâcher vos textures dealloc, voici un exemple:

for(int i=0; i<10; i++) { 
     glDeleteTextures(1, &textures[i]); 
    }