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.

questionAnswers(2)

yourAnswerToTheQuestion