变量在NSLog中看起来很奇怪?

时间:2011-06-20 23:58:15

标签: objective-c xcode debugging cocos2d-iphone nslog

我对iphone app开发很新,所以我开始使用Cocos2d框架而不是从头开始完全客观c,因为它降低了学习曲线,我发现它更容易。我正在尝试从Cocos2d网站上做一些教程,但是,作为人而不是羊,已经决定尝试一些本教程中没有的东西。

所以,这是教程中的相关代码:

- (void)ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event {
    CGPoint location = [self convertTouchToNodeSpace: touch];
    [cocosGuy stopAllActions];
    [cocosGuy runAction: [CCMoveTo actionWithDuration:1 position:ccp( location.x + 32, location.y + 32)]];

这可以正常工作,cocos家伙移动到我触摸我的ipod的地方,延迟一秒和32像素偏移。所以现在,我想得到一些文字反馈,以及我在点击屏幕的位置。我尝试使用NSLog显示有关触摸location的一些信息:

 NSLog([NSString stringWithFormat:@"x=%d y=%d", location.x, location.y]);

Xcode告诉我:Format not a string literal and no format arguments。除非我完全弄错了,@"text"是目标C中的字符串文字,两个位置变量是格式参数。

运行时,控制台显示如下内容:

2011-06-20 19:54:22.765 Lesson1[315:707] x=0 y=1078640640
2011-06-20 19:54:23.887 Lesson1[315:707] x=0 y=1080631296
2011-06-20 19:54:24.576 Lesson1[315:707] x=0 y=1080242176

当我在三个随机位置触摸ipod屏幕时。 x似乎永远不会改变,y总是一个大整数。

我的代码出了什么问题,并且对iphone开发,Objective c和cocos2d这个世界不熟悉,我怎么能在将来尝试更好地调试它?

请注意,这实际上是我第二天尝试所有这些,所以请原谅我,如果这是一个非常明显或愚蠢的问题。

3 个答案:

答案 0 :(得分:8)

x, y的{​​{1}}成员为CGPoint,而非float,因此您应使用int代替%f。< / p>

此外,%d能够自行格式化。尝试:

NSLog()

代替。请注意,在NSLog(@"x=%f y=%f", location.x, location.y); 的第一个参数上面的代码中:

NSLog()

是一个字符串文字,而在你的代码中,第一个参数不是字面值:

@"x=%f y=%f"

答案 1 :(得分:3)

看起来你正在使用错误的字符串格式说明符。

%d适用于int,但x结构的yCGPoint属性实际上是CGFloat(已定义)作为floatdouble,取决于32位或64位)

您可以在此处查看Apple的格式说明符列表: http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Strings/Articles/formatSpecifiers.html%23//apple_ref/doc/uid/TP40004265

它说CGFloats应该使用%f%g代替。

要使+stringWithFormat:正确解释这些值,您的格式字符串应如@"x=%f y=%f"

另一个提示 - NSLog()实际上内置了格式,因此您只需使用

NSLog(@"x=%f y=%f", location.x, location.y);

而不是[NSString stringWithFormat:…

答案 2 :(得分:1)

警告的原因是NSLog期望其第一个参数是字符串文字,并且您将它传递给您刚刚创建的对象。另外,我非常确定location.xlocation.y将是浮点数,而不是整数。尝试使用%f代替%d。无论如何,您应该使用NSLog来格式化字符串,如下所示:

NSLog(@"x=%f y=%f", location.x, location.y);