NSInteger vs. intNSInteger is typedef'ed based on the target architecture. In other word, it's an architecture-safe (64 vs 32 bit) type to support different platforms and implementations of C. Targeting a 32-bit CPU and OS it's 32-bits wide, on a 64-bit OS it's 64-bits wide.
What follows is how NSInteger is defined in NSObjCRuntime.h file :
And this is what Apple say in Foundation Data Types Reference :
Simply, the NSInteger typedef does a step for you: if the architecture is 32-bit, it uses int, if it is 64-bit, it uses long. Using NSInteger, you don't need to worry about the architecture that the program is running on.
Apple recommends that you use NSInteger over normal types anyway, I would assume for portability!