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