J'ai rencontré un comportement très étrange que je ne comprends pas. J'ai une classe Texture
avec contentWidth
propriété de type int
. Cette classe est enveloppée dans une classe Image
qui a une propriété width
de type int
. Le width
d'un Image
est calculé simplement comme le contentWidth
de la texture sous-jacente:Valeurs dynamiques de saisie et de retour dans Objective-C
- (int) width
{
return texture.contentWidth;
}
Maintenant, le Image
est utilisé par une classe Button
(par la composition, pas l'héritage) qui veut lire la taille de l'image:
// image is of type ‘id’
int width = [image width];
int height = [image height];
Le problème est que la variable height
est définie correctement, tandis que la variable width
contient NaN
(-2147483648). J'ai vérifié les dimensions - ils sont environ 200 × 100 ou plus, loin de la limite int
. En outre, l'infobulle du débogueur Xcode affiche correctement les deux propriétés dans le Texture
, mais seulement après que la largeur ait traversé les deux accesseurs, le numéro est brouillé. Les objets ne sont pas libérés. Qu'est-ce que je rate?
Mise à jour: J'ai élargi l'accesseur dans la classe Image
pour voir où le problème provient:
- (int) width
{
const int w = texture.contentWidth;
return w;
}
Maintenant, quand je pause sur la première ligne, le w
correctement obtient l'ensemble. Je fais un pas sur les déclarations d'exécution à la fonction appelante:
- (void) foo
{
int bar = [image width];
}
... et maintenant le bar
contient NaN
.
Mise à jour: Hmm, il a obtenu:
int foo = [image width]; // image is id, returns NaN
int bar = [(Image*) image width]; // correct value
Le image
est déclarée comme id
, qui est le point ici. Quelqu'un pourrait-il expliquer cela? J'ai le sentiment que je n'appelle pas la bonne méthode, mais que se passe-t-il exactement ici? Je tape toujours mes variables aussi strictement que possible, mais ici le type id
est pratique. Je n'avais aucune idée que cela pourrait entraîner un tel bug.
Avez-vous implémenté un accesseur contentWidth dans votre classe Texture? –
Quelle est la différence entre les accesseurs de largeur et de hauteur? Comment l'accesseur de hauteur est-il implémenté dans Image? – Tim
@Tim: Il n'y a pas de différence, l'accesseur 'height' est exactement le même. Sauf pour les noms, bien sûr :) – zoul