int,NSInteger和NSUInteger之间的区别

Hit*_*rth 36 iphone int objective-c nsinteger nsuinteger

是什么之间的主要区别int,NSIntegerNSUInteger在Objective-C?

哪一个更适合在应用程序中使用?为什么?

Bas*_*ian 29

在这种情况下,您可以右键单击并转到定义:

#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
Run Code Online (Sandbox Code Playgroud)


zap*_*aph 20

区别在于抽象类型及其关联的大小.现在我们不必担心int的大小或指针在任何特定硬件上有多大.

"C"在这方面很糟糕,只说明long至少与int一样大,int是硬件的"自然"整数大小(无论这意味着什么),int至少与int一样长短 - 一个(大混乱).

这在Fortran的时候似乎是一个好主意,但没有成熟.

可以使用POSIX定义,例如uint32_t,int16_t等.但是这并没有解决指针在任何特定硬件上需要多大的问题.

因此,如果Apple将返回类型定义为NSUInteger,则只需使用它,您无需知道特定硬件的大小是16位,32位还是64位.(我只是为了一个例子,我在无线中选择了这些值).

正如你在@Bastian中看到的那样,实际大小取决于硬件.

文档回答了"问题的信",但没有提供对"为什么"的理解?

  • 这是API标准化.这些框架采用多种体系结构 - 对于API而言,它们在所有体系结构中都是相同的.通过拥有这些typedef,Apple正在从API消费者那里抽象出平台差异.如果您只根据这些类型与API对话,那么(理论上)在编译i386,x86_64,ppc,arm7或其他任何代码时,您不需要考虑平台差异.这是一个抽象.据说你应该使用最高级别的抽象来完成工作.因此,除非你有理由不使用这些类型,否则我说使用'em. (3认同)