NSString vs%i with stringWithFormat

时间:2012-09-19 20:15:34

标签: iphone objective-c nsstring stringwithformat

好的我不确定这是怎么做或为什么有效但如果有人能向我解释这一点,我将不胜感激。

我正在调试一个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

任何人都知道为什么会这样吗?

谢谢!

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

  [self.webView stringByEvaluatingJavaScriptFromString:callback];
}

答案 2 :(得分:0)

因为问题是"这个错误的代码做了什么"而不是"如何解决它":

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位计算机上然后很可能是第二个%我会拿起myStr指针的剩余32位而不是数字117.如果你使用

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

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