Digitação dinâmica e valores de retorno em Objective-C
Eu me deparei com um comportamento muito estranho que eu não consigo entender. eu tenho umTexture
classe comcontentWidth
propriedade do tipoint
. Esta classe é envolvida em umImage
classe que tem umwidth
propriedade do tipoint
. owidth
de umImage
é computado simplesmente como ocontentWidth
da textura subjacente:
- (int) width
{
return texture.contentWidth;
}
Agora oImage
é usado por umButton
classe (por composição, não herança) que quer ler o tamanho da imagem:
// image is of type ‘id’
int width = [image width];
int height = [image height];
O problema é que oheight
variável fica bem, enquanto owidth
variável contémNaN
(–2147483648). Eu verifiquei as dimensões - elas são cerca de 200 × 100 ou mais, nem perto daint
limite. Além disso, a dica de ferramenta do depurador Xcode mostra as duas propriedades noTexture
corretamente, somente após a largura passar pelos dois acessadores, o número fica truncado. Os objetos não são liberados. o que estou perdendo?
Atualizar: Eu expandi o acessador noImage
classe para ver onde o problema se origina:
- (int) width
{
const int w = texture.contentWidth;
return w;
}
Agora quando eu quebrar na primeira linha, ow
fica definido corretamente. Eu passo, a execução retorna para a função de chamada:
- (void) foo
{
int bar = [image width];
}
… E agora obar
contémNaN
.
Atualizar: Mhm, entendi:
int foo = [image width]; // image is id, returns NaN
int bar = [(Image*) image width]; // correct value
oimage
é declarado comoid
, que é o ponto aqui. Alguém poderia explicar isso? Eu tenho a sensação de que não estou chamando o certowidth
método, mas o que exatamente está acontecendo aqui? Eu sempre escrevo minhas variáveis o mais estritamente possível, mas aquiid
O tipo é útil. Eu não tinha ideia que isso poderia resultar em um bug desse tipo.