実際、XCode には arm64 アーキテクチャが含まれるようになりました。NSInteger は、 NSObjCRuntime.h で定義されているため、完全に異なるものになりました。
#if __LP64__ || (TARGET_OS_EMBEDDED && !TARGET_OS_IPHONE) || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64
typedef long NSInteger;
typedef unsigned long NSUInteger;
#else
typedef int NSInteger;
typedef unsigned int NSUInteger;
#endif
それに対処するには、コードベースを改善する必要があります。まず第一に、あなたは本当に一貫している必要があります。NSInteger を int ではなく NSInteger にのみ割り当てます。あらゆる種類の回避:
int i = [aString integerValue] (NSInteger を返すため)
しかし
NSInteger i = [aString integerValue] (そして、長い型であれば問題ありません。)
さらに、別の問題として、値から文字列を作成する場合があります。あなたができることは次のようなものです:
#define cL(v) (long)(v)
#define cUL(v) (unsigned long)(v)
NSLog(@"array.count: %ld", cUL(anArray.count));
array.count は、armv7(s) では unsigned int を返し、arm64 では unsigned long を返します。常に unsigned long にキャストすることで、警告が表示されなくなり、さらに重要なことに、バグが発生しなくなります。
この「ロジック」は、Apple 自身がいくつかのテクニカル トーク ビデオで紹介しています:
https://developer.apple.com/tech-talks/videos/ (ビデオ「Architecting Modern iOS Games」。ビデオを 10 分頃に再生してください)