Programa trava quando libera UIImage depois de gerar OpenGL ES textura
Pergunta
Agora, eu segui este tutorial:
http: // iphonedevelopment .blogspot.com / 2009/05 / OpenGL ES-da-terra-up-parte 6_25.html
Não funciona se eu tentasse liberar UIImage: Eu vou obter um 'EXC_BAD_ACCESS'. Agora, eu fiz o UIImage a ser variáveis ??de instância e retê-los. Eu não torná-lo autorelease. Mas o problema é às vezes eu quero apagar o meu textura. Eu preciso libertar os UIImage ou então eu vou ter um vazamento. (A ferramenta de desempenho vazamentos relatório que UIImage provoca vazamentos) Mas se eu liberar UIImage, vou receber EXC_BAD_ACCESS. E eu não estou sequer desenhá-los ou acessá-los em qualquer lugar em tudo. O programa só trava direita para onde ele ficou release:
#0 0x30011940 in objc_msgSend ()
#1 0x302395f4 in CFGetTypeID ()
#2 0x308f480c in -[UIImage(UIImageDeprecated) imageRef] ()
#3 0x308f4ae0 in SharedIdentifierForImage ()
#4 0x308f4a30 in _UISharedImageDealloc ()
#5 0x308f4964 in -[UIImage dealloc] ()
#6 0x30236b78 in -[NSObject release] ()
#7 0x0000a374 in -[Texture dealloc] (self=0x184b30, _cmd=0x300f7fd0) at /Users/akaraphan/Desktop/Competition/TrapRoom/Classes/Texture.m:329
#8 0x30236b78 in -[NSObject release] ()
#9 0x30235f24 in CFRelease ()
#10 0x302043bc in __CFTypeCollectionRelease ()
#11 0x30205dac in __CFArrayReleaseValues ()
#12 0x30205c18 in __CFArrayDeallocate ()
#13 0x30236020 in _CFRelease ()
#14 0x30235efe in CFRelease ()
#15 0x3054836a in -[NSCFArray release] ()
#16 0x00011658 in -[GameSprite dealloc] (self=0x1838d0, _cmd=0x300f7fd0) at /Users/akaraphan/Desktop/Competition/TrapRoom/Classes/GameSprite.m:40
...
...
Linha 329 em Texture.m é onde eu lançar minha UIImage.
Meu código é um pouco diferente do tutorial, mas ele deve estar trabalhando de forma muito semelhante:
- (id) initFromImage: (NSString*)imageFile{
if (self = [super init]){
path = [[NSBundle mainBundle] pathForResource:imageFile ofType:@"png"];
texData = [[NSData alloc] initWithContentsOfFile:path];
img = [[UIImage alloc] initWithData:texData];
CGImageRef image = img.CGImage;
width = CGImageGetWidth(image);
height = CGImageGetHeight(image);
if (image){
int tempWidth = (int)width, tempHeight = (int)height;
if ((tempWidth & (tempWidth - 1)) != 0 ){
NSLog(@"CAUTION! width is not power of 2. width == %d", tempWidth);
}else if ((tempHeight & (tempHeight - 1)) != 0 ){
NSLog(@"CAUTION! height is not power of 2. height == %d", tempHeight);
}else{
GLubyte *spriteData = (GLubyte*) calloc(width * 4, height * 4);
CGContextRef spriteContext = CGBitmapContextCreate(spriteData, width, height, 8, width*4, CGImageGetColorSpace(image), kCGImageAlphaPremultipliedLast);
CGContextDrawImage(spriteContext, CGRectMake(0.0, 0.0, width, height), image);
CGContextRelease(spriteContext);
glGenTextures(1, &GLtexture);
glBindTexture(GL_TEXTURE_2D, GLtexture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, spriteData);
free(spriteData);
CGImageRelease(image);
NSLog(@"Texture %d", GLtexture);
}
}else NSLog(@"ERROR: Image not loaded...");
return self;
}
return nil;
}
Se você pode ver o que está errado, por favor me orientar. Obrigado.
Solução
De alguma forma, a remoção
CGImageRelease(image)
corrigiu o problema. Posso remover UIImage depois disso, sem qualquer problema e não há vazamento também.