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.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage