I would say use standard C99 uintptr_t for pointer sized integers. The definition of NSInteger looks sufficiently cloudy not to be sure it is guaranteed to hold a pointer.
Use NSInteger where the API uses it, if you must. But long will do for all practical purposes.
Looking at NSObjCRunTime, I don't really get the motivation for its current definition. Probably to have an integer type large enough to go up to, for instance, the maximum number of items in an NSArray?
#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