为iOS开发时,什么时候应该使用NSInteger
vs. int? 我在Apple示例代码中看到,在将值作为参数传递给函数或从函数返回值时,它们使用NSInteger
(或NSUInteger
)。
- (NSInteger)someFunc;...
- (void)someFuncWithInt:(NSInteger)value;...
但是在函数中,它们只是使用int
来跟踪值
for (int i; i < something; i++)
...
int something;
something += somethingElseThatsAnInt;
...
我已经读过(被告知) NSInteger
是在64位或32位环境中引用整数的安全方法,那么为什么要使用int
呢?
#1楼
在iOS上,当前使用int
还是NSInteger
无关紧要。 如果/当iOS移至64位时,这将更为重要。
简而言之, NSInteger
的int
是32位代码(因此是32位长),而long
的值是64位代码(64位代码中的long
s是64位宽,而32位代码是32位)。位代码)。 使用NSInteger
而不是long
的最可能原因是不中断现有的32位代码(使用int
)。
CGFloat
有相同的问题:在32位(至少在OS X上),它是float
; 在64位上,它是double
。
更新:随着iPhone 5s,iPad Air,带Retina的iPad Mini和iOS 7的推出,您现在可以在iOS上构建64位代码。
更新2:此外,使用NSInteger
可以帮助实现Swift代码的互操作性。
#2楼
如果需要将它们与常量值(例如NSNotFound或NSIntegerMax)进行比较,则应使用NSIntegers,因为这些值在32位和64位系统上会有所不同,因此索引值,计数等应使用:NSInteger或NSUInteger。
在大多数情况下,使用NSInteger不会造成任何伤害,只是它占用的内存是原来的两倍。 内存影响很小,但是如果您一次有大量的数字在浮动,那么使用整数可能会有所不同。
如果您确实使用NSInteger或NSUInteger,则在使用格式字符串时,您将希望将它们转换为长整数或无符号长整数,因为如果您尝试注销NSInteger时就好像它具有已知长度,则新的Xcode功能会返回警告。 同样,将它们发送到类型为int的变量或参数时,也应小心,因为您可能会在过程中失去一些精度。
总的来说,如果您不希望一次存储数十万个内存,那么使用NSInteger会比不断担心两者之间的差异要容易得多。
#3楼
从目前(2014年9月)开始,如果您还为arm64构建应用程序,则建议在与iOS API等交互时使用NSInteger/CGFloat
。 这是因为当您使用float
, long
和int
类型时,您可能会得到意想不到的结果。
示例:浮点/双点与CGFLOAT
作为示例,我们采用UITableView委托方法tableView:heightForRowAtIndexPath:
在仅32位应用程序中,如果这样编写,它将可以正常工作:
-(float)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return 44;
}
float
是32位值,您要返回的44是32位值。 但是,如果我们在64位arm64体系结构中编译/运行同一段代码,则44将是64位值。 如果期望的值为32位,则返回64位的值会产生意外的行高。
您可以使用CGFloat
类型解决此问题
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return 44;
}
此类型表示在32位环境中为32位float
在64位环境中为64位double
。 因此,使用此类型时,无论编译/运行时环境如何,该方法将始终接收预期的类型。
对于期望整数的方法也是如此。 此类方法在32位环境中期望32位int
值,而在64位环境中期望64位long
。 您可以通过使用NSInteger
类型来解决这种情况,该类型基于编译/运行时环境用作int
或long
。
#4楼
int = 4字节(固定大小,与架构师无关)NSInteger =取决于架构师的大小(例如,对于4字节架构师= 4字节NSInteger大小)
#5楼
当您不知道代码可以在哪种处理器体系结构上运行时,通常需要使用NSInteger
,因此出于某种原因,您可能想要最大可能的整数类型,在32位系统上,该整数类型仅为int
,而在64位系统上则为int
。位系统,它很long
。
除非您特别需要,否则我会坚持使用NSInteger
而不是int
/ long
。
NSInteger
/ NSUInteger
被定义为这些类型之一的* dynamic typedef
*,它们的定义如下:
#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
关于应为每种类型使用的正确格式说明符,请参阅《 字符串编程指南》中有关平台依赖项的部分
来源:oschina
链接:https://my.oschina.net/stackoom/blog/3188982