Я столкнулся с очень странным поведением, которое не могу понять. У меня есть Texture
класс с contentWidth
свойством типа int
. Этот класс обернут в класс Image
, который имеет свойство width
типа int
. width
Image
вычисляется просто как contentWidth
базовой текстуры:
- (int) width
{
return texture.contentWidth;
}
Теперь Image
используется классом Button
(по составу, а не по наследству), который хочет прочитать размер изображения:
// image is of type ‘id’
int width = [image width];
int height = [image height];
Проблема в том, что переменная height
устанавливается очень хорошо, тогда как переменная width
содержит NaN
(–2147483648). Я проверил размеры - они примерно 200 × 100 или около того, нигде рядом с пределом int
. Также подсказка отладчика XCode показывает оба свойства в Texture
правильно, только после того, как ширина проходит через два метода доступа, число искажается. Объекты не освобождаются. Чего мне не хватает?
Обновление: Я расширил метод доступа в классе Image
, чтобы увидеть, откуда возникла проблема:
- (int) width
{
const int w = texture.contentWidth;
return w;
}
Теперь, когда я разбиваю первую строку, w
устанавливается правильно. Я перехожу, выполнение возвращается к вызывающей функции:
- (void) foo
{
int bar = [image width];
}
… и теперь bar
содержит NaN
.
Обновление: Ммм, получил:
int foo = [image width]; // image is id, returns NaN
int bar = [(Image*) image width]; // correct value
image
объявляется как id
, что и здесь. Может кто-нибудь объяснить это? У меня есть ощущение, что я не вызываю правильный метод width
, но что именно здесь происходит? Я всегда печатаю свои переменные настолько строго, насколько это возможно, но здесь тип id
удобен. Я понятия не имел, что это может привести к такой ошибке.