192

私はいくつかの演習を行っていますが、次のような警告が表示されます。

暗黙的な変換により整数の精度が失われます: 'NSUInteger' (別名 'unsigned long') から 'int' へ

#import <Foundation/Foundation.h>

int main (int argc, const char * argv[])
{
    @autoreleasepool {

        NSArray *myColors;

        int i;
        int count;

        myColors = @[@"Red", @"Green", @"Blue", @"Yellow"];

        count = myColors.count; //  <<< issue warning here

        for (i = 0; i < count; i++)

        NSLog (@"Element %i = %@", i, [myColors objectAtIndex: i]);
    }

    return 0;
}

スクリーンショット

4

4 に答える 4

479

countメソッドは をNSArray返しNSUInteger、64 ビット OS X プラットフォームでは

  • NSUIntegerとして定義されunsigned long
  • unsigned long64 ビットの符号なし整数です。
  • int32 ビット整数です。

よりintも「小さい」データ型でNSUIntegerあるため、コンパイラの警告が表示されます。

「Foundation Data Types Reference」のNSUIntegerも参照してください。

32 ビット アプリケーションを構築する場合、NSUInteger は 32 ビットの符号なし整数です。64 ビット アプリケーションは、NSUInteger を 64 ビット符号なし整数として扱います。

そのコンパイラ警告を修正するには、ローカルcount変数を次のように宣言します。

NSUInteger count;

または (配列に複数の2^31-1要素が含まれないことが確実な場合!)、明示的なキャストを追加します。

int count = (int)[myColors count];
于 2013-06-04T13:19:34.440 に答える
24

マーティンの答えに反して、int へのキャスト (または警告を無視する) は、配列に 2^31-1 を超える要素がないことがわかっていても、常に安全とは限りません。64 ビット用にコンパイルする場合ではありません。

例えば:

NSArray *array = @[@"a", @"b", @"c"];

int i = (int) [array indexOfObject:@"d"];
// indexOfObject returned NSNotFound, which is NSIntegerMax, which is LONG_MAX in 64 bit.
// We cast this to int and got -1.
// But -1 != NSNotFound. Trouble ahead!

if (i == NSNotFound) {
    // thought we'd get here, but we don't
    NSLog(@"it's not here");
}
else {
    // this is what actually happens
    NSLog(@"it's here: %d", i);

    // **** crash horribly ****
    NSLog(@"the object is %@", array[i]);
}
于 2014-07-30T23:16:17.013 に答える
6

プロジェクト > ビルド設定のキーを変更する " typecheck calls to printf/scanf : NO "

説明 : [仕組み]

printf や scanf などの呼び出しをチェックして、指定された引数の型が指定された書式文字列に適していること、および書式文字列で指定された変換が適切であることを確認します。

それがうまくいくことを願っています

その他の警告

Objective C の暗黙的な変換により、整数精度 'NSUInteger' (別名 'unsigned long') が 'int' に失われます

キーを変更する " 32Bits Type > Debug > *64 アーキテクチャへの暗黙的な変換: No "

[注意: 64 ビット アーキテクチャ変換の他の警告が無効になる場合があります] .

于 2015-01-21T09:48:02.740 に答える
3

「int」への明示的なキャストを行うと、私の場合は問題が解決します。同じ問題がありました。そう:

int count = (int)[myColors count];
于 2016-09-12T11:42:49.670 に答える