【问题标题】:NSString vs %i with stringWithFormatNSString 与 %i 与 stringWithFormat
【发布时间】:2012-09-19 20:15:34
【问题描述】:

好的,我不确定这是如何或为什么起作用的,但如果有人可以向我解释这一点,我将不胜感激。

我正在调试一个 iPhone 应用程序,Xcode 给我以下警告,这是正确的:“格式指定类型 'int' 但参数有一个类型 'NSString'。

下面的代码返回一个数字,但如果我将它设置为一个字符串,它会返回一个很长的字符串。我知道他们想要整数而不是字符串,但我不知道为什么这会为字符串返回一个数字,因为当我使用 [str intValue] 更改它时,我得到“0”而不是长数字。那么这是如何工作的,有人可以向我解释一下吗?

代码如下:

- (void) FooBar:(NSString *)myStr
{
  NSString *callback = [NSString stringWithFormat:@"Some Text Here(%i)", myStr];

  [self.webView stringByEvaluatingJavaScriptFromString:callback];
}

好的,让我告诉你我的意思,请不要担心字符串被传递。我只想知道它是如何产生如下所示的数字的。我做了三个 NSLog:

- (void) FooBar:(NSString *)myStr
{
  NSString *callback = [NSString stringWithFormat:@"Some Text Here(%i)", myStr];
    NSLog(@"NSString = %@", myStr);
    NSLog(@"Percent i = %i", myStr);
    NSLog(@"Percent i = %i", [myStr intValue]);

  [self.webView stringByEvaluatingJavaScriptFromString:callback];
}

结果:

NSString = /__utm.gif?utmwv=4.8mi&utmn=1220166202&utmt=event&utme=5(Init*shoutzVersion*iPhone%20Simulator)(1)&utmcs=UTF-8&utmsr=320x480&utmsc=24-bit&utmul=en-us&utmac=UA-28151051-1&utmcc=__utma%3D1.1697021890.1347557664.1348092917.1348092961.195%3B&utmht=1348092961213&utmqt=9984

Percent i = 154448576

Percent i = 0

有人知道为什么会这样吗?

谢谢!

【问题讨论】:

  • Aaaand euh,顺便说一句,编译器是对的,你的问题对我来说不太有意义......你能详细说明一下吗?你能指望什么?那个应该是整数的字符串是什么?

标签: iphone objective-c nsstring stringwithformat


【解决方案1】:

如果数字(在您的情况下为长数字)超出范围,您可能会得到 [str intValue] 结果 0。试试 [str floatValue] 或 [str doubleValue] 看看结果。

【讨论】:

  • 你会想要 %f 代表浮点数和 %d 代表双精度值。
  • 我以为他正在尝试 stringWithFormat 因为 [str intValue] 返回 0,这是他不期望的。顺便说一句,双倍,它是 %ld! %d 代表整数!
  • %ld STILL 不是双倍的,它很长。
  • 好的,大家看看我能不能解释一下我在问什么。首先,我知道如何修复或更改它,所以这不是我要问的。最初的程序员这样做是为了得到一个数字而不是字符串值。我想知道这如何以及为什么会返回一个数字?当我查看字符串值时,它是一个很长的路径类型命令,但是当它是 %i 时,它是一个像“1232089”这样的数字,如果我执行 str doublevalue 或任何其他数字格式之类的操作,我得到 0。所以 %我正在将字符串转换为数字值,但我不知道它是如何做到的。这有意义吗?
  • 不是“ld”的意思是long double吗? :)
【解决方案2】:
- (void) FooBar:(NSString *)myStr
{
  NSString *callback = [NSString stringWithFormat:@"Some Text Here(%@)", myStr];

  [self.webView stringByEvaluatingJavaScriptFromString:callback];
}

【讨论】:

  • 你只是用错了东西。 %i 显示整数 %f 显示浮点数 %@ 显示字符串等
【解决方案3】:

因为问题是“这个不正确的代码做了什么”而不是“如何修复它”:

NSString *callback = [NSString stringWithFormat:@"Some Text Here(%i)", myStr];

myStr 是一个 NSString*。 %i 是 int 的格式。因此,当 stringWithFormat 方法需要一个 int 时,您正在传递一个 NSString*。

正式地说,这是“未定义的行为”,这意味着绝对有可能发生任何事情。

实际上,您可以在 32 位或 64 位计算机或 iPhone 上运行此代码。 “int”在所有情况下都是 32 位。 myStr 是一个 NSString*,它将是 32 位或 64 位。在 32 位计算机上运行,​​stringWithFormat 最有可能取指针的 32 位,假装它们是 int 的 32 位,并相应地打印出来,所以通常你会得到一个很大的数字;如果 myStr == nil 你可能会得到一个 0 打印。这个数字只是一个对任何人都没有用的数字。

在 64 位计算机上,myStr 是一个 64 位指针。最有可能的是,64 位中的 32 位将被解释为 int 并以这种方式打印。然后剩下 32 位。由于您没有尝试打印任何其他参数,因此这些 32 位将被忽略并且不会造成任何伤害。如果你用过

[NSString stringWithFormat:@"Some text %i some number %i", myStr, 117];

在 64 位计算机上,第二个 %i 很可能会拾取 myStr 指针的剩余 32 位,而不是数字 117。如果您使用过

    [NSString stringWithFormat:@"Some number %i some text %@", myStr, myStr];

这在 64 位计算机上可能是致命的。最有可能的是 %i 获取 myStr 的前 32 位。 %@ 拾取第一个 myStr 的其他 32 位,再加上另外 32 位,给出一个完全混乱的指针,并且尝试打印它很可能会崩溃。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-14
    相关资源
    最近更新 更多