web-dev-qa-db-ja.com

目的cの暗黙的な変換は整数精度 'NSUInteger'(別名 'unsigned long')を 'int'警告に失う

私はいくつかのエクササイズをしていて、次のような警告を受けています。

暗黙の変換は整数精度 '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;

}

Screenshot

175
monkeyboy

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

  • NSUIntegerunsigned longとして定義され、
  • unsigned longは64ビットの符号なし整数です。
  • intは32ビット整数です。

したがって、intNSUIntegerよりも「小さい」データ型であるため、コンパイラは警告を発します。

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

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

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

NSUInteger count;

または(あなたの配列が決して2^31-1個以上の要素を含むことがないことが確実であるならば)、明示的なキャストを追加します:

int count = (int)[myColors count];
449
Martin R

Martinの答えとは反対に、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]);
}
24
Adrian

「プロジェクト」>「ビルド設定」でキーを変更します。「printf/scanfへのタイプチェック呼び出しNO

説明:[仕組み]

Printfやscanfなどの呼び出しを調べて、指定された引数が指定されたフォーマット文字列に適した型であること、およびフォーマット文字列で指定された変換が意味をなすことを確認してください。

うまくいけば

その他の警告

客観的なCの暗黙的な変換は整数の精度 'NSUInteger'(別名 'unsigned long')を 'intに失います

キーを変更します。 "2ビットへの暗黙的な変換>デバッグ> * 64アーキテクチャ:いいえ"

[注意: 64ビットアーキテクチャ変換の他の警告を無効にするかもしれません]

4
Darshit Shah

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

int count = (int)[myColors count];
2