Dynamiczne wpisywanie i zwracanie wartości w Objective-C
Wpadłem na bardzo dziwne zachowanie, którego nie mogę zrozumieć. mamTexture
klasa zcontentWidth
właściwość typuint
. Ta klasa jest zapakowana wImage
klasa, która mawidth
właściwość typuint
. Thewidth
zImage
jest obliczany po prostu jakocontentWidth
podstawowej tekstury:
- (int) width
{
return texture.contentWidth;
}
TerazImage
jest używany przez aButton
klasa (według składu, a nie dziedziczenia), która chce odczytać rozmiar obrazu:
// image is of type ‘id’
int width = [image width];
int height = [image height];
Problem polega na tym, żeheight
zmienna jest ustawiana w porządku, podczas gdywidth
zmienna zawieraNaN
(–2147483648). Sprawdziłem wymiary - są około 200 × 100 lub więcej, nigdzie w pobliżuint
limit. Także opis debugera Xcode pokazuje obie właściwości wTexture
poprawnie, tylko po tym, jak szerokość przejdzie przez dwa akcesory, liczba zostanie zniekształcona. Obiekty nie są uwalniane. czego mi brakuje?
Aktualizacja: Rozszerzyłem akcesorium wImage
klasa, aby zobaczyć, skąd pochodzi problem:
- (int) width
{
const int w = texture.contentWidth;
return w;
}
Teraz, gdy włamuję się do pierwszej linii,w
zostaje poprawnie ustawiony. Cofam się, wykonanie powraca do funkcji wywołującej:
- (void) foo
{
int bar = [image width];
}
… A terazbar
zawieraNaN
.
Aktualizacja: Mhm, rozumiem:
int foo = [image width]; // image is id, returns NaN
int bar = [(Image*) image width]; // correct value
Theimage
jest zadeklarowany jakoid
, o co tu chodzi. Czy ktoś mógłby to wyjaśnić? Mam przeczucie, że nie nazywam tego prawymwidth
metoda, ale co tu właściwie się dzieje? Zawsze wpisuję moje zmienne tak ściśle, jak to możliwe, ale tutajid
typ jest przydatny. Nie miałem pojęcia, że może to spowodować taki błąd.