2009-08-23 5 views
0

Ich erhalte Fehler vom Typ EXC-BAD-ACCESS, wo ich eine neue UIImage-Instanz erstelle, indem ich den Wert eines bereits existierenden UIImage (wie unten) zuweise, und ich versuche herauszufinden, was das Problem ist. Es gibt einen Haufen Code zu sortieren und ich bin mir nicht sicher, wo ich anfangen soll, also werde ich die Quelle nicht posten - aber es könnte mir bei meiner Untersuchung helfen, mir zu sagen, Was genau los ist (Speicher (-wise) wenn ich ein neues UIImage erstelle, indem ich von einem anderen gebe?Was passiert hinter den Kulissen, wenn ich ein neues UIImage durch Zuweisung erstelle?

(in the .h) 

UIImage* myExistsImage; 

... 

@property (retain) UIImage* myExistsImage; 

... 

-(UIImage*)rotateImage:(UIImage*)imageToRotate; 



---------------------------------------------------- 


(in the .m) 
@synthesize myExistsImage; 

... 

UIImage* myNewImage = [self rotateImage:myExistsImage]; 


... 

-(UIImage*)rotateImage:(UIImage*)imageToRotate 
{ 

UIImage* rotatedImage = imageToRotate; 

//Rotate Image Here (details omitted)... 

return rotatedImage; 
} 

Antwort

2
UIImage* rotatedImage = imageToRotate; 

In dieser Linie sind Sie nicht ein neues UIImage-Objekt erstellen; Sie erstellen einfach einen neuen Zeiger auf den alten Zeiger. Wenn Rotate Image Here direkte Änderungen an rotatedImage impliziert, dann ändern Sie auch myExistsImage. Wenn Sie ein neues UIImage-Objekt für das rotierte Objekt erstellen möchten, müssen Sie dies explizit mit den Methoden UIImage alloc und init tun.

+0

Oh. Also, da es nur ein Zeiger ist, wenn die tatsächlichen Bilddaten, die er zeigt, freigegeben werden, dann könnte dies der Grund sein, dass mein EXC-BAD-ACCESS korrekt ist? Vielen Dank! – RexOnRoids

+0

Ja. Wenn Sie möchten, dass die Daten erhalten bleiben, bis beide Zeiger fertig sind, fügen Sie einfach einen Retain hinzu, wenn Sie den Zeiger kopieren. –

2

Mit Code wie:

UIImage* src; 
UIImage* dst = src; 

... alles, was Sie tun, ist das Kopieren einen Zeiger. Um sicher zu gehen, dass dst und src auf einen gültigen zeigen, müssen Sie retain auf dem UIImage zweimal aufrufen - einmal für src und einmal für dst. Wenn Sie keinen Zeiger mehr benötigen, sollten Sie release über die UIImage aufrufen - wenn alle Zeiger verschwunden sind, wird der letzte Aufruf an release die freigeben. Was Sie sehen, ist, dass die UIImage veröffentlicht wird, während Sie noch daran interessiert sind, es zu verwenden; Sie müssen retain es dann, um das zu verhindern.

Verwandte Themen