En ce moment, j'ai suivi ce tutoriel:programme se bloque lors de presse UIImage après avoir généré la texture OpenGL ES
http://iphonedevelopment.blogspot.com/2009/05/opengl-es-from-ground-up-part-6_25.html
Il ne fonctionne pas si j'essayé de libérer UIImage: Je vais obtenir un « EXC_BAD_ACCESS ». Maintenant, j'ai fait en sorte que UIImage soit une variable d'instance et les conserve. Je ne le fais pas autorelease. Mais le problème est parfois que je veux supprimer ma texture. J'ai besoin de libérer ces UIImage sinon je vais avoir une fuite. (Les fuites de l'outil Performance signalent que UIImage provoque des fuites) Mais si je libère UIImage, j'obtiendra EXC_BAD_ACCESS. Et je ne les dessine même pas ou je n'y accède nulle part. Le programme se bloque juste à où il se libérer:
#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
...
...
Ligne 329 à Texture.m est où je libère mon UIImage.
Mon code est un peu différent du tutoriel mais il devrait fonctionner très similaire:
- (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;
}
Si vous pouvez voir ce qui ne va pas, s'il vous plaît me guider. Je vous remercie.