What is the difference between int and NSInteger?

Prasad picture Prasad · May 19, 2011 · Viewed 15.4k times · Source

Possible Duplicates:
When to use NSInteger vs int?
Why is there is an NSInteger?

Can we use int and NSInteger interchangably? Is there any specific situation to use NSInteger only, instead of using int?

Answer

JeremyP picture JeremyP · May 19, 2011

Can we use int and NSInteger interchangably?

No. On the LP64 architecture used by Apple, for modern OS X Cocoa, NSInteger is 64 bits wide. This means that if you cast an NSInteger to an int, comparisons against NSNotFound may fail. Here's an example:

NSRange theRange = [@"foo" rangeOfString @"x"];
int location = theRange.location;
if (location == NSNotFound) // comparison is broken due to truncation in line above
{
    // x not in foo
}

In my opinion, you should only use NSInteger where you need to pass a parameter to Cocoa or receive a result from Cocoa and the documentation says the data type is NSInteger. In all other cases:

  • if you don't care about the width of the type, use a C type e.g. int or long.
  • if you do care about the width of the type, use the C99 stdint.h types e.g. int32_t, int64_t.
  • if you need an int guaranteed big enough to hold a pointer, use intptr_t or uintptr_t