-3

Ok I am not sure how or why this is working but if someone could explain this to me it would be greatly appreciated.

I am debugging an iPhone app and Xcode gives me the following warning, which is correct: "Format Specifies type 'int' but the Argument has a Type 'NSString'.

The code below returns a number, but if I set it to a string it returns a very long string. I know that they wanted the integer and not the string, but I do not know why this would return a number for a string because when I do change it using [str intValue] I get "0" not the long number. So how is this working, can someone explain this to me?

Here is the code:

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

  [self.webView stringByEvaluatingJavaScriptFromString:callback];
}

Ok let me show you what I mean, and don't worry about the string being passed please. I just want to know how it produces a number like what is shown below from it. I did three NSLogs:

- (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];
}

Results:

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

Anyone know why this happens?

Thank You!

4

3 回答 3

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

  [self.webView stringByEvaluatingJavaScriptFromString:callback];
}
于 2012-09-19T20:50:55.033 回答
0

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

于 2012-09-19T20:20:35.110 回答
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 位计算机上,那么第二个 %i 很可能会获取 myStr 指针的剩余 32 位而不是数字 117。如果您使用

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

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

于 2014-07-31T11:26:56.427 回答