2009-09-11 3 views
0

を生成した後にUIImageを離したとき、私はこのチュートリアルに従っている:プログラムがクラッシュした今のOpenGL ESのテクスチャ

http://iphonedevelopment.blogspot.com/2009/05/opengl-es-from-ground-up-part-6_25.html

私はUIImageを解放しようとした場合、それは動作しません:私は「EXC_BAD_ACCESS」を取得します。今、UIImageをインスタンス変数にして保持しました。私はそれをautoreleaseにしません。しかし、問題は時々私のテクスチャを削除したいです。私はそれらのUIImageをリリースする必要がありますそうでなければ、私はリークがあります。 (パフォーマンスツールのリークはUIImageがリークを引き起こすと報告しています)しかし、私がUIImageをリリースすれば、EXC_BAD_ACCESSを取得します。そして、私はそれらを描くことさえしていないし、どこにでもそれらにアクセスしていない。プログラムは、ちょうどそれが解放しましたところでクラッシュ:

#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 
... 
... 

をライン329 Texture.mに私は私のUIImageを解放する場所です。

私のコードは、チュートリアルとは少々異なっていますが、それは非常に同様に作業する必要があります。

- (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; 
} 

あなたが間違っているかを見ることができる場合、私を導いてください。ありがとうございました。

答えて

1

何とか除去

CGImageRelease(image) 

は、問題を修正しました。私はその後、UIImageを問題なく削除することができ、漏れもありません。

関連する問題