【发布时间】:2009-07-11 08:44:24
【问题描述】:
我遇到了一个非常奇怪的行为,我无法理解。我有一个Texture 类,其contentWidth 属性类型为int。此类包装在具有width 类型int 的width 属性的Image 类中。 Image 的 width 被简单地计算为底层纹理的 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 类型很方便。我不知道它会导致这样的错误。
【问题讨论】:
-
您是否在 Texture 类中实现了 contentWidth 访问器?
-
宽度和高度访问器有什么区别? Image中的高度访问器是如何实现的?
-
@Tim:没有区别,'height' 访问器看起来完全一样。当然,除了名字:)
-
@Perspx:是的,否则编译器会在 Image 类的“width”访问器中报错。
标签: objective-c dynamic-typing