Из заголовков от Apple:
#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 или долго, в зависимости от целевой платформы. Вы не получаете предупреждение, когда не выполняете бросок, потому что вы, скорее всего, работаете на 64-битной платформе. Если вы нацелитесь на 32-битную платформу, вы получите предупреждение без актерского состава.
Вы можете использовать% zd, который будет работать без использования на 32-битных и 64-битных платформах (но только для целых чисел со знаком).
Вы можете сделать что-то вроде этого, и никогда не беспокоиться об этом (но есть падение производительности):
NSInteger myNSInteger = 12345;
[NSString stringWithFormat:@"%@", @(myNSInteger)];