Objective c NSLog中的变量看起来很奇怪?

Objective c NSLog中的变量看起来很奇怪?,objective-c,xcode,debugging,cocos2d-iphone,nslog,Objective C,Xcode,Debugging,Cocos2d Iphone,Nslog,我对iphone应用程序开发非常陌生,因此我开始使用Cocos2d框架,而不是从头开始使用完全客观的c,因为它降低了一些学习曲线,而且我发现这要容易得多。我试图在Cocos2d网站上做一些教程,但是,作为人而不是羊,我决定尝试一些教程中没有的东西 下面是教程中的相关代码: - (void)ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event { CGPoint location = [self convertTouchToNod

我对iphone应用程序开发非常陌生,因此我开始使用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显示有关触摸位置的一些信息:

 NSLog([NSString stringWithFormat:@"x=%d y=%d", location.x, location.y]);
Xcode善意地通知我:
格式不是字符串文字,也没有格式参数
。除非我完全错了,
@“text”
在objective 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来说都是新手,我将来如何才能更好地自己调试它呢


请注意,这是我第二天尝试所有这些,如果这是一个非常明显或愚蠢的问题,请原谅我。CGPoint的
x,y
成员是
float
s,而不是
int
s,因此你应该使用
%f
而不是
%d

另外,
NSLog()
本身也可以进行格式化。尝试:

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

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

[NSString stringWithFormat:@"x=%d y=%d", location.x, location.y]

CGPoint
x,y
成员是
float
s,而不是
int
s,因此您应该使用
%f
而不是
%d

另外,
NSLog()
本身也可以进行格式化。尝试:

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

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

[NSString stringWithFormat:@"x=%d y=%d", location.x, location.y]

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

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

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

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

看起来您使用了错误的字符串格式说明符

%d
表示
int
,但
CGPoint
结构的
x
y
属性实际上是
CGFloat
(根据32位或64位定义为
float
double

您可以在此处看到苹果的格式说明符列表:

它说CGfloat应该使用
%f
%g

要使
+stringWithFormat:
正确解释值,格式字符串应类似于
@“x=%f y=%f”

另一个技巧–NSLog()实际上内置了格式,所以您可以直接使用

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

您似乎使用了错误的字符串格式说明符,而不是
[nsstringwithformat:…

%d
表示
int
,但
CGPoint
结构的
x
y
属性实际上是
CGFloat
(根据32位或64位定义为
float
double

您可以在此处看到苹果的格式说明符列表:

它说CGfloat应该使用
%f
%g

要使
+stringWithFormat:
正确解释值,格式字符串应类似于
@“x=%f y=%f”

另一个技巧–NSLog()实际上内置了格式,所以您可以直接使用

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

编译器正在阻止您创建一个经典的安全漏洞,而不是
[NSString stringWithFormat:…

;如果您的字符串偶然创建了一个无意中的转义序列,那么您将面临一次很好的拒绝服务攻击(最多)@bbum拒绝服务到什么?一个ipod?它没有阻止我编译,它只是抛出了一个警告。编译器正在阻止你创建一个经典的安全漏洞;如果你的字符串碰巧有一个偶然创建的转义序列,那么你的手上会有一个很好的拒绝服务攻击(最多)@bbum拒绝服务到什么?一个ipod?它没有阻止我编译,它只是抛出了一个警告。这解决了它。并带来了另外两个小问题:我如何转换为int?我如何将NSString对象转换为字符串文本?@Cyc如果你需要转换为
int
,请使用
(int)location.x
(然后
%d
格式的字符串就可以了)。您不能将特定的字符串转换为文字字符串,因为它取决于
location.x
location.y
的值,并且这些值在运行时是已知的(并且可以变化)。请注意
@“x=%f y=%f”