int 和 NSInteger 有什么区别?

发布于 2024-11-09 02:04:49 字数 423 浏览 2 评论 0原文

可能的重复:
何时使用 NSInteger 与 int?
为什么会有 NSInteger?

我们可以使用 int 和 NSInteger 可以互换吗?是否有任何特定情况只使用 NSInteger 而不是使用 int

Possible Duplicates:
When to use NSInteger vs int?
Why is there is an NSInteger?

Can we use int and NSInteger interchangably? Is there any specific situation to use NSInteger only, instead of using int?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

对岸观火 2024-11-16 02:05:41

我会说使用标准 C99 uintptr_t 作为指针大小的整数。 NSInteger 的定义看起来很模糊,无法确定它是否保证保存一个指针。

如果必须的话,请在 API 使用 NSInteger 的地方使用 NSInteger。但对于所有实际目的来说,长期就足够了。

看看 NSObjCRunTime,我并没有真正理解其当前定义的动机。可能有一个足够大的整数类型,例如可以达到 NSArray 中的最大项目数?

#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

I would say use standard C99 uintptr_t for pointer sized integers. The definition of NSInteger looks sufficiently cloudy not to be sure it is guaranteed to hold a pointer.

Use NSInteger where the API uses it, if you must. But long will do for all practical purposes.

Looking at NSObjCRunTime, I don't really get the motivation for its current definition. Probably to have an integer type large enough to go up to, for instance, the maximum number of items in an NSArray?

#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
泅人 2024-11-16 02:05:31

我们可以互换使用 int 和 NSInteger 吗?

不会。在 Apple 使用的 LP64 架构上,对于现代 OS X Cocoa,NSInteger 是 64 位宽。这意味着,如果将 NSInteger 转换为 int,则会与 NSNotFound 可能会失败。这是一个例子:

NSRange theRange = [@"foo" rangeOfString @"x"];
int location = theRange.location;
if (location == NSNotFound) // comparison is broken due to truncation in line above
{
    // x not in foo
}

在我看来,你应该只在需要将参数传递给 Cocoa 或从 Cocoa 接收结果并且文档说数据类型为 NSInteger 的情况下使用 NSInteger >。在所有其他情况下:

  • 如果您不关心类型的宽度,请使用 C 类型,例如 intlong
  • 如果您确实关心类型的宽度,请使用 C99 stdint.h 类型,例如 int32_tint64_t
  • 如果您需要保证足够大的 int 来容纳指针,请使用 intptr_tuintptr_t

Can we use int and NSInteger interchangably?

No. On the LP64 architecture used by Apple, for modern OS X Cocoa, NSInteger is 64 bits wide. This means that if you cast an NSInteger to an int, comparisons against NSNotFound may fail. Here's an example:

NSRange theRange = [@"foo" rangeOfString @"x"];
int location = theRange.location;
if (location == NSNotFound) // comparison is broken due to truncation in line above
{
    // x not in foo
}

In my opinion, you should only use NSInteger where you need to pass a parameter to Cocoa or receive a result from Cocoa and the documentation says the data type is NSInteger. In all other cases:

  • if you don't care about the width of the type, use a C type e.g. int or long.
  • if you do care about the width of the type, use the C99 stdint.h types e.g. int32_t, int64_t.
  • if you need an int guaranteed big enough to hold a pointer, use intptr_t or uintptr_t
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文