当前位置:  开发笔记 > IOS > 正文

在Cocoa你喜欢NSInteger还是int,为什么?

如何解决《在Cocoa你喜欢NSInteger还是int,为什么?》经验,为你挑选了3个好方法。

NSInteger/ NSUInteger是常规内置类型的Cocoa定义替换.

在内置插件上使用NS*类型有什么好处吗?你更喜欢哪个?为什么?是NSIntegerint在32位/ 64位平台的宽度相同?



1> Theo..:

我理解的方式是NSInteger等.是相应C类型的体系结构安全版本.基本上它们的大小取决于体系结构,但例如,NSInteger保证保存当前体系结构的任何有效指针.

Apple建议你使用它们来使用OS X 10.5及更高版本,Apple的API会使用它们,所以养成使用它们的习惯绝对是个好主意.它们需要更多的打字,但除此之外似乎没有任何理由不使用它们.



2> mmalc..:

64位运行时的量化问题

在某些情况下,可能有充分的理由使用标准类型而不是NSInteger:64位系统中的"意外"内存膨胀.

显然,如果整数是8而不是4个字节,则值占用的内存量会加倍.但是,假设不是每个值都是整数,您通常不应期望应用程序的内存占用量增加一倍.但是,Mac OS X分配内存的方式会根据请求的内存量而变化.

目前,如果要求512字节或更少,则malloc向上舍入到16字节的下一个倍数.但是,如果要求超过512个字节,则malloc向上舍入到512的下一个倍数(至少1024个字节).假设您定义了一个类 - 其中 - 声明了五个NSInteger实例变量,而在32位系统上,每个实例占用了272个字节.在64位系统上,实例理论上需要544个字节.但是,由于内存分配策略,每个实际上占用1024个字节(几乎增加了四倍).如果使用大量这些对象,则应用程序的内存占用量可能会比您预期的要大得多.如果NSIntegersint_32变量替换变量,则只能使用512个字节.

因此,当您选择要使用的标量时,请确保选择合理的内容.您是否有任何理由需要比32位应用程序中所需的值更大的值?使用64位整数来计算秒数不太可能是必要的......


内存在现代设备上更丰富的事实并不是浪费记忆的好借口.当然,在这里浪费额外的32位或者有一点变化,但是如果它是一个结构域或实例变量,并且它被分配了数千次,那么它就会变成镍和一角钱的效果.粗心编程并且在不知不觉中使用64位值时,32位会导致内存膨胀 - 如果你有机会避免它,我想不出一个很好的借口,不要抓住低调的果实.
目前还不清楚这里的问题是什么:我的评论直接与Cocoa有关,当你选择表示变量的类型时,这是一个重要的考虑因素.仅仅因为你使用Cocoa并不意味着你永远不必考虑与应用程序性能相关的因素......
是的,但从统计上来说,让程序员放弃位和字节会更有效率.我们谈论的是Cocoa,而不是libc.另一方面,在iPhone上你可能会有一个观点,具体取决于应用程序.

3> Sören Kuklau..:

64位实际上是NSInteger和NSUInteger的存在理由; 在10.5之前,那些不存在.这两个被简单地定义为64位的long,以及32位的int:

#if __LP64__ || NS_BUILD_32_LIKE_64
typedef long NSInteger;
typedef unsigned long NSUInteger;
#else
typedef int NSInteger;
typedef unsigned int NSUInteger;
#endif

因此,当您需要"位原生"大小时,使用它们代替更基本的C类型.

CocoaDev有更多信息.

推荐阅读
携手相约幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有