Programm crash, für mich zu erklähren

N

nima

Aktives Mitglied
Thread Starter
Dabei seit
10.04.2008
Beiträge
149
Reaktionspunkte
2
Hi,
also erstmal vorweg, ich bin noch nicht so lange bei Objective-C. Jetzt habe ich eine Klasse geschrieben. So weit läuft auch der Rest. Nur beim Aufruft dieser Funktion verabschiedet sich mein Programm. Bzw. Ich kann die Funktion einmal aufrufen. Ein zweites mal geht nicht.
Code:
- (void)setTexture:(CIImage*)inputImage {
	NSLog(@"RenderCIImageOpenGL: setTexture()");
	if(bmpRep) {
		[bmpRep release];
		glDeleteTextures(1, &txID);
	}
	if(!inputImage) { return; }
	[COLOR="Red"]bmpRep = [[[NSBitmapImageRep alloc] initWithCIImage:inputImage] retain];[/COLOR]
	bmpRep = [NSBitmapImageRep imageRepWithData:[bmpRep TIFFRepresentation]];
	imageInfo.height = [bmpRep size].height;
	imageInfo.width = [bmpRep size].width;	
	//[self initGL];
}
Der Crash liegt denke ich mal an der roten Zeile. In der Konsole bekomme ich "BAD_ACCESS" zurück. Ich erklähre mir das ganze so.
Beim ersten Aufruf wird NSBitmapImageRep mit dem CIImage (inputImage) initialisiert. Wird die Funktion ein zweites mal Aufgerufen, wird in der IF-Abfrage das bmpRep zerstört. So kann es dann nicht mehr initialisiert werden. Oder so.
BAD_ACCESS sagt mir nach meiner Interpretation, ich versuchte auf was zuzugreifen was gar nicht da ist.
Mein Problem liegt jetzt darin dass ich nicht genau weiss, wie ich den Fehler umgehen kann. Das bmpRep muss aber bei jedem Neuaufruf der Funktion zerstört werden, ja sonst immer im Speicher bleiben würde. So würde dann nach mehreren Aufrufen ja der Speicherhunger des Programms enorm. Ausserdem muss das bmpRep im Header deklariert sein, da ich es noch in anderen Funktionen verwenden möchte.

Vielen, Vielen Dank & Grüße,
Nico
 
Ganz offensichtlich hast Du memory management unter Cocoa nicht verstanden. (1)

Daher vermute ich, dass die Instanz von CIImage beim zweiten Aufruf schon released wurde

Alex

1) Das weiss ich, weil es keinen Grund für [[X] alloc] init] retain] gibt, und Du dieses -- Doppelt-retainte! -- Objekt auch nie wieder frei gibts.
 
Hi,
vielen Dank für deine Antwort.
ich habs jetzte so abgeändert:
Code:
- (void)setTexture:(CIImage*)inputImage {
	NSLog(@"RenderCIImageOpenGL: setTexture()");
	[inputImage retain];
	if(bmpRep) {
		[bmpRep release];
		glDeleteTextures(1, &txID);
	}
	if(!inputImage) { return; }
	bmpRep = [[NSBitmapImageRep alloc] initWithCIImage:inputImage];
	bmpRep = [NSBitmapImageRep imageRepWithData:[bmpRep TIFFRepresentation]];
	imageInfo.height = [bmpRep size].height;
	imageInfo.width = [bmpRep size].width;	
	[inputImage release];
	[self initGL];
}
Was mir jetzt noch aufgefallen ist, wenn ich das Programm minimiere und maximiere verabschiedet es sich auch. Seltsam finde ich.

Gruß,
Nico
 
Nein, das ändert alles wenig.

Du solltest Dir noch einmal das hier ansehen.

Im Detail:
Code:
	bmpRep = [[NSBitmapImageRep alloc] initWithCIImage:inputImage];
	bmpRep = [NSBitmapImageRep imageRepWithData:[bmpRep TIFFRepresentation]];

In der ersten Zeile erzeugst Du ein NSBitmapImageRep Objekt mit einem Retain Count von 1.
In der zweiten Zeile weist Du dem selben Pointer ein neues NSBitmapImageRep Objekt das im Autorelease Pool ist zu. Das erste Objekt wird zum Memory Leak

Ohne das gesamtwerk zu kennen, wäre wahrscheinlich richtiger:
Code:
	bmpRep = [[[NSBitmapImageRep alloc] initWithCIImage:inputImage] autorelease];
	bmpRep = [[NSBitmapImageRep imageRepWithData:[bmpRep TIFFRepresentation]] retain];

ACHTUNG: Das sage ich jetzt, ohne Deinen Code genauer zu kennen, das kann auch falsch sein.
Warum Du diese "durch die Brust ins Auge machst" (also die BitmapImageRep mit sich selbst initialisiert) klingt auch sehr merkwürdig, aber da kenne ich die Doku nicht auswendig.

das [inputImage retain] und [inputImage release] kannst Du Dir sparen, wenn inputImage vorher kaputt war wird es dadurch nicht mehr ganz.

Alex

P.S.:
Was mir jetzt noch aufgefallen ist, wenn ich das Programm minimiere und maximiere verabschiedet es sich auch. Seltsam finde ich.
Ich würde einen Kasten Bier Wetten, dass das auch ein Memory Problem ist.
 
Hi,
vielen, vielen Dank. Ich denke jetzt habe auch ich es verstanden. Es klappt jetzt auch alles.
Ich habe mir gerade mal den Memory Management Article von der ADC als "Bett Lektüre" ausgedruckt. Ich denke damit werde ich die Thematik noch besser verstehen.

Grüße,
Nico
 
@below
du warst wohl auch nicht aufm cocoaheads treffen ?
 
Zurück
Oben Unten