Frage

Im Moment habe ich dieses Tutorial gefolgt:

http: // iphonedevelopment .blogspot.com / 2009/05 / opengl-es-von-Boden-up-Teil-6_25.html

Es funktioniert nicht, wenn ich versuche UIImage zu lösen: Ich werde ein ‚EXC_BAD_ACCESS‘ bekommen. Nun habe ich die UIImage Instanzvariablen zu sein und sie zu halten. Ich mache es nicht Autorelease. Aber das Problem ist, manchmal möchte ich meine Textur löschen. Ich brauche diese UIImage zu veröffentlichen oder sonst werde ich ein Leck haben. (Die Leaks Performance Tool berichten, dass UIImage verursacht Lecks) Aber wenn ich UIImage loslassen, werde ich EXC_BAD_ACCESS bekommen. Und ich bin nicht einmal sie zeichnen oder sie überall überhaupt erreichbar. Das Programm gerade stürzt direkt an, wo er bekam Mitteilung:

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

Linie 329 in Texture.m ist, wo ich meine UIImage veröffentlichen.

Mein Code ist ein wenig anders aus dem Tutorial, aber es sollte sehr ähnlich funktionieren:

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

Wenn Sie sehen, was falsch ist, treten Sie mit mir führen. Danke.

War es hilfreich?

Lösung

Irgendwie Entfernen

CGImageRelease(image)

das Problem behoben. Ich kann ohne Probleme UIImage danach entfernen und es gibt auch kein Leck.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top