Anyone have the expertise to explain when to use NSUInteger and when to use NSInteger?
I had seen Cocoa methods returning NSInteger even in cases where the returned value will always be unsigned.
What is the fundamental reason? Is NSInteger or int strictly limited to if we want to represent negative value?
From 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
You should also be aware of integer conversion rules when dealing with NSUInteger vs. NSInteger:
The following fragment for example returns 0 (false) although you’d expect it to print 1 (true):
The reason is that the [si] variable is being implicitly converted to an unsigned int!
See CERT’s Secure Coding site for an in-depth discussion around these ‘issues’ and how to solve them.