0

NSSegmentedControlを送信者として設定し、ユーザーがオブジェクトの各ボタンをクリックしたときに関数を追加します。以下のスニペットは常に問題なく機能しました。それでも機能しますが、64ビットアーキテクチャを使用してビルドすると、次の警告が表示されます。32ビットに戻すと警告が消えます。コードの編集方法について誰かにアドバイスしてもらえますか?助けてくれてありがとう。-ポール。

"暗黙の変換は整数の精度を失います:NSInteger(別名long)から" int "

int selectedSegment = [arSegController selectedSegment];
int clickedSegmentTag = [[arSegController cell] tagForSegment:selectedSegment];

if (clickedSegmentTag == 0) {
4

4 に答える 4

1

NSInteger変数の代わりにを使用する必要がありintます。の宣言を見ることができますが、NSSegmentedControl.hAppleのCocoa用64ビット移行ガイドを読むことをお勧めします。

于 2012-08-14T15:13:13.157 に答える
1

NSIntegerは、typedefの長さにすぎません。NSIntegerを使用する必要がありますが、何らかの理由でintを使用する必要がある場合は、型キャストを試してください。

int selectedSegment = (int)[arSegController selectedSegment];
于 2012-08-14T15:16:02.150 に答える
1

64ビットガイド

4バイト長のintに8バイト長のlong変数を割り当てていると思います。MacではLP64を使用していると思います。つまり、longとポインタは8バイトになります。selectedSegment NSIntegerも宣言すると、問題が解決するはずです。32ビットマシンでは、長さは32ビットになりますが、64ビットマシンでは64ビットになります。

NSInteger selectedSegment = [arSegController selectedSegment]; 
NSInteger clickedSegmentTag = [[arSegController cell] tagForSegment:selectedSegment]; 

if (clickedSegmentTag == 0) { 
于 2012-08-14T15:20:24.507 に答える
0

NSIntegerは、64ビットプラットフォームではlongに定義されているようです(したがって、32ビットOS XおよびiOSでは、この警告は表示されません)。また、これらのプラットフォームでは、longは64ビット長ですが、intは32ビットのみです。したがって、コンパイラーが指示するように、精度が低下します。数値>=2 ^ 32は32ビットで表すことができないため、これらの数値の場合、(数値が切り捨てられることに関連して)奇妙な動作が発生する可能性があります。

解決策:メソッドの戻り値を明示的にキャストし(int)ます。

于 2012-08-14T15:20:53.247 に答える