2013-05-28 41 views
7

因此,我试图弄清楚我应该关心NSInteger vs int。我没有CS学位,所以很多这些类型的转换参数都很难理解。尽我所知,这个论点是“在iOS中使用NSInteger而不是int,这样最终如果/当64位iOS出来时,你的变量仍然是存储指针的合适大小。”很公平。除了我从未在我的整数存储指针。NSInteger与iOS上的64位体系结构

假设我有一个int存储欠杰克魔法计数,另一个int存储皮肤cat的方法数量,我将它们在函数之间传递并将它们写入到Core Data中,那么Apple发布64位iOS - 有哪些变化?为什么我在乎?

另外,如果我照顾,为什么不是使用int32_t而不是NSInteger的参数?看起来好像将是保持事情可预测的方式。

+0

皮肤猫的皮肤数量可能很容易超过32位。哎呀,甚至64位可能是不够的;-) ;-) ;-) – dasblinkenlight

+0

我从来没有理解NSInteger的要点...现在,如果它是NSObject(如NSNumber),那么我可以理解它...我个人从未使用NSInteger,因为它会损害我的跨平台兼容性...... – Goz

+3

@dasblinkenlight - 这不是一只猫,它是一只小狗,它被搞砸了,没有被剥皮。在开发人员离开“int”和“short”,然后“long”开放解释的时候,C的开发很早就完成了。并重新解释。并重新解释。而且......每一次试图理清它似乎都在滥用另一只狗。据我了解,Objective-C/Cocoa人发明了NSInteger,因此他们可以控制该类型的大小,而不受其他int类型的影响,这样如果其他定义发生变化,它们的声明接口可以保持无害(反之亦然) –

回答

5

关于使用C99的<stdint.h>标题中的类型的观点是绝对有效的:这些类型使您可以更好地控制整型类型的大小。但是,NS-前缀整型类型早于<stdint.h>的标准化,因此引入了一组并行抽象。

我使用NS-与Cocoa方法交互时的前缀整型类型。例如,如果可可方法返回NSUinteger,我也使用NSUinteger类型声明我的变量。

我使用<stdint.h>类型的变量在我的程序中时,我需要精确控制存储数据的大小。以Core Data结尾的项目就属于这一类。

当积分类型的大小无关紧要时,例如,当我需要for循环中的循环控制变量时,我使用int

2

我的建议:

  • 当写的OBJ-C代码,使用NSInteger。然后它符合您使用的框架。它可能会从int更改一次(int64_t,long,?)。

  • 如果编写C/C++代码(便携性)明显不要使用NSInteger

如果你认为你的变量将超过INT_MAX(常量。检查here)你可以使用int64_t(当你想有32/64位弹性编码)或long(如果你不共享内存对象在您的应用的32/64位版本之间)。当你确定在变量中没有负值时,请考虑使用无符号类型(uintuint64_t)。内部:对于指针,请不要使用int。使用void *

相关问题