Escritura dinámica y valores de retorno en Objective-C
Me he encontrado con un comportamiento muy extraño que no puedo entender. tengo unTexture
clase concontentWidth
propiedad de tipoint
. Esta clase está envuelta en unImage
clase que tiene unawidth
propiedad de tipoint
. loswidth
de unaImage
se calcula simplemente como elcontentWidth
de la textura subyacente:
- (int) width
{
return texture.contentWidth;
}
Ahora elImage
es utilizado por unButton
Clase (por composición, no por herencia) que quiere leer el tamaño de la imagen:
// image is of type ‘id’
int width = [image width];
int height = [image height];
El problema es que laheight
variable se establece bien, mientras que la variablewidth
variable contieneNaN
(–2147483648). He comprobado las dimensiones: son aproximadamente 200 × 100 o menos, en ninguna parte cerca delint
límite. También la información sobre herramientas del depurador de Xcode muestra ambas propiedades en elTexture
correctamente, solo después de que el ancho atraviesa los dos accesores, el número se confunde. Los objetos no son liberados. ¿Qué me estoy perdiendo?
Actualizar: He ampliado el accessor en elImage
clase para ver donde se origina el problema:
- (int) width
{
const int w = texture.contentWidth;
return w;
}
Ahora cuando rompo en la primera línea, elw
se establece correctamente. Paso por encima, la ejecución vuelve a la función de llamada:
- (void) foo
{
int bar = [image width];
}
... y ahora elbar
contieneNaN
.
Actualizar: Mhm, lo tengo
int foo = [image width]; // image is id, returns NaN
int bar = [(Image*) image width]; // correct value
losimage
se declara comoid
, que es el punto aquí. ¿Alguien podría explicar esto? Tengo la sensación de que no estoy llamando a la derechawidth
Método, pero ¿qué está pasando exactamente aquí? Siempre escribo mis variables lo más estrictamente posible, pero aquíid
el tipo es útil No tenía idea de que podría dar lugar a tal error.