Dynamische Eingabe und Rückgabewerte in Objective-C
Ich bin auf ein sehr merkwürdiges Verhalten gestoßen, aus dem ich keinen Sinn machen kann. Ich habe einTexture
Klasse mitcontentWidth
Eigentum des Typsint
. Diese Klasse ist in eineImage
Klasse, die eine hatwidth
Eigentum des Typsint
. Daswidth
von einemImage
wird einfach als berechnetcontentWidth
der zugrunde liegenden Textur:
- (int) width
{
return texture.contentWidth;
}
Jetzt dieImage
wird von aButton
Klasse (nach Komposition, nicht nach Vererbung), die die Bildgröße lesen möchte:
// image is of type ‘id’
int width = [image width];
int height = [image height];
Das Problem ist, dass dieheight
Variable wird ganz gut gesetzt, während diewidth
Variable enthältNaN
(–2147483648). Ich habe die Abmessungen überprüft - sie sind ungefähr 200 × 100, bei weitem nicht in der Nähe desint
Grenze. Auch der Xcode Debugger Tooltip zeigt beide Eigenschaften imTexture
Richtig, erst nachdem die Breite durch die beiden Accessoren gelangt ist, wird die Nummer verstümmelt. Die Objekte werden nicht freigegeben. Was vermisse ich?
Aktualisieren: Ich habe den Accessor im erweitertImage
Klasse, um zu sehen, wo das Problem entsteht:
- (int) width
{
const int w = texture.contentWidth;
return w;
}
Jetzt, wenn ich in der ersten Zeile breche, wird derw
wird richtig eingestellt. Wenn ich übersteige, kehrt die Ausführung zur aufrufenden Funktion zurück:
- (void) foo
{
int bar = [image width];
}
... und jetzt diebar
enthältNaN
.
Aktualisieren: Mhm, verstanden:
int foo = [image width]; // image is id, returns NaN
int bar = [(Image*) image width]; // correct value
Dasimage
wird deklariert alsid
, worum geht es hier. Könnte jemand das erklären? Ich habe das Gefühl, nicht das Richtige zu nennenwidth
Methode, aber was genau ist hier los? Ich gebe meine Variablen immer so streng wie möglich ein, aber hier dieid
Typ ist praktisch. Ich hatte keine Ahnung, dass dies zu einem solchen Fehler führen könnte.