我遇到了一个非常奇怪的行为,我无法理解。我有一个Texture具有contentWidthtype 属性的类int。这个类被包装在一个Image具有widthtype 属性的类中int。的简单地计算为width底层纹理的 :ImagecontentWidth
- (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类型很方便。我不知道它会导致这样的错误。