-3

これがどのように、またはなぜ機能しているのかはわかりませんが、誰かがこれを説明してくれれば大歓迎です。

iPhone アプリをデバッグしていて、Xcode から次の警告が表示されますが、これは正しいものです:「フォーマットはタイプ 'int' を指定していますが、引数にはタイプ 'NSString' があります。

以下のコードは数値を返しますが、文字列に設定すると非常に長い文字列が返されます。彼らが文字列ではなく整数を望んでいることは知っていますが、[str intValue] を使用して変更すると、長い数値ではなく「0」が得られるため、これが文字列の数値を返す理由がわかりません。それで、これはどのように機能していますか、誰かが私にこれを説明できますか?

コードは次のとおりです。

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

  [self.webView stringByEvaluatingJavaScriptFromString:callback];
}

わかりました、私の言いたいことをお見せしましょう。文字列が渡されることを心配しないでください。以下に示すような数値がどのように生成されるかを知りたいだけです。3 つの 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

なぜこれが起こるのか知っている人はいますか?

ありがとう!

4

3 に答える 3

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 ビット コンピューターでは、2 番目の %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 に答える
0

数値(あなたの場合は長い数値)が範囲外の場合、[str intValue] 結果 0 を取得している可能性があります。[str floatValue] または [str doubleValue] を試して、結果を確認してください。

于 2012-09-19T20:20:35.110 に答える
0
- (void) FooBar:(NSString *)myStr
{
  NSString *callback = [NSString stringWithFormat:@"Some Text Here(%@)", myStr];

  [self.webView stringByEvaluatingJavaScriptFromString:callback];
}
于 2012-09-19T20:50:55.033 に答える