NSInteger and NSUInteger in a mixed 64bit / 32bit environment

64-bit, arm64, ios, objective-c

Solution

I think the safest way is to box them into `NSNumber` instances.

NSLog(@"Number is %@", @(number)); // use the highest level of abstraction

This boxing doesn't usually have to create a new object thanks to tagged pointer magic.

If you really don't want to use `NSNumber`, you can cast primitive types manually, as others suggested:

NSLog(@"Number is %ld", (long)number); // works the same on 32-bit and 64-bit

Problem

I have a fair amount of string format specifiers in NSLog / NSAssert etc. calls which use `%d` and `%u` with `NSInteger (= int on 32bit)` and `NSUInteger (= unsigned int on 32bit)` types respectively. When converting the app to 64bit, this gives warnings (of course), as `%ld %lu` is expected for what now became a `long` and `unsigned long` type. Simply converting the format specifiers will of course introduce the reverse warnings in the 32bit build. So the only solution I see to become warning free is using the 64bit specifiers, and casting to the 64bit value types everywhere a warning is given in the 32bit build. But I was wondering if perhaps there are format specifiers specifically for the `NSInteger` and `NSUInteger` type which would work on both architectures without casting?

Original source

Related problems