在调试我的 iPhone 项目时,我看到了一些相当奇怪的行为。除其他外,在 UIViewController 后代的头文件中,我有这个:
@interface OOGameDetailsViewController : UIViewController <OOXMLParserDelegate,OOServerDelegate>
{
...
OOXMLNode *node;
float elheights[6];
...
}
@property (readwrite, retain) OOXMLNode *gameNode;
...
@end
然后在代码中,我为这个数组赋值:
- (void)setNode:(OOXMLNode *)aNode
{
node = aNode;
[self updateUserDefaults];
[background setImage:[gameNode imageFromKey:@"background"]];
CGFloat maxw = 240.0f;
NSString *text = [gameNode elementNodeWithKey:@"title"].value;
CGSize sizeOfText=[text sizeWithFont:[UIFont boldSystemFontOfSize:20.0f]
constrainedToSize:CGSizeMake(maxw, CGFLOAT_MAX)
lineBreakMode:UILineBreakModeWordWrap];
...
elheights[0] = 10 + sizeOfText.height;
text = [gameNode elementNodeWithKey:@"age"].value;
sizeOfText=[text sizeWithFont:[UIFont systemFontOfSize:16.0f]
constrainedToSize:CGSizeMake(maxw, CGFLOAT_MAX)
lineBreakMode:UILineBreakModeWordWrap];
...
elheights[1] = 10 + sizeOfText.height;
...
elheights[2] = 10 + height;
...
elheights[3] = 10 + separatorHeight;
text = [gameNode elementNodeWithKey:@"intro"].value;
sizeOfText=[text sizeWithFont:[UIFont boldSystemFontOfSize:14.0f]
constrainedToSize:CGSizeMake(maxw, CGFLOAT_MAX)
lineBreakMode:UILineBreakModeWordWrap];
...
elheights[4] = sizeOfText.height;
...
elheights[5] = 20 + btnHeight;
[mainTable reloadData];
}
这个想法很简单:我将 6 个浮点值分配给一个 6 元素数组 - 索引从 0 到 5。但是,当我在调试器中逐步执行此代码时,我始终看到每个分配都分配了索引 1 高于指示的数组元素。即,elheights[0] = ...
实际上将这个值赋值给elheights[1]
等等。最后一个赋值(赋值给索引为 5 的元素什么都不做)。
为了证明我没有疯,这里是调试器的截图(相关部分的裁剪 - 将图像大小保持在最小)。第一个是在分配之前,第二个是在分配之后。
我清理了项目并重新启动;我关闭了模拟器,关闭了 Xcode,重新打开并重新启动 - 结果相同。ObjectiveC 处理简单 C 风格数组的方式有什么特别之处吗?
在此先感谢,-Aleks