iOS アプリケーションのコードを arm64 用にコンパイルしているときに、カスタム Foundation 型のさまざまな基本型に関連する興味深い問題に直面しました。NSUIntegerとして宣言された数値をprintf(またはstringWithFormat)したいとします
[NSString stringWithFormat:@"%u", _depth,
NSUInteger は arm64 に対して unsigned long として宣言されているため、arm64 のコンパイル時に警告が生成されます。したがって、「%u」を「%lu」に置き換える必要がありますが、32 ビット アーキテクチャでは NSUInteger が unsigned int として宣言されているため、armv7(s) アーキテクチャ用にコンパイルすると無効になります。「NSUIntegerをフォーマット引数として使用しないでください」という警告が表示されることを認識しているので、フロートに進みましょう:
typedef CGFLOAT_TYPE CGFloat;
64 ビットではCGFLOAT_TYPEはdoubleですが、32 ビットではfloatです。したがって、次のようにします。
- (void)foo:(CGFloat)value;
その後
[self foo:10.0f];
[self foo:10.0];
2 つのアーキテクチャー用にコンパイルすると、依然として警告が生成されます。32 ビット アーキテクチャでは、2 番目の呼び出しは正しくありません (double から float への変換)。64 ビット アーキテクチャでは、最初の呼び出しで float が double に変換されます (これは問題ありませんが、まだ良くありません)。
この問題についてのご意見をお待ちしております。