何时使用NSInteger与int

ぐ巨炮叔叔 提交于 2020-03-06 12:51:52

为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位时,这将更为重要。

简而言之, NSIntegerint是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 。 这是因为当您使用floatlongint类型时,您可能会得到意想不到的结果。

示例:浮点/双点与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类型来解决这种情况,该类型基于编译/运行时环境用作intlong


#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

关于应为每种类型使用的正确格式说明符,请参阅《 字符串编程指南》中有关平台依赖项的部分

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!