2011-05-19 152 views
14

可能重複:
When to use NSInteger vs int?
Why is there is an NSInteger?int和NSInteger有什麼區別?

我們可以使用intNSInteger互換?有沒有什麼具體的情況只能使用NSInteger,而不是使用int

+2

的可能的複製[當使用NSInteger的VS INT?](http://stackoverflow.com/questions/4445173/when-to-use-nsinteger-vs-int)[如何轉換NSInteger的到int](http://stackoverflow.com/questions/1752701/),或[爲什麼有一個NSInteger](http://stackoverflow.com/questions/5870867/),只有三[衆多](http:///stackoverflow.com/search?q=nsinteger+int)。 – 2011-05-19 18:23:09

回答

19

我們可以互換使用int和NSInteger嗎?

不。在Apple使用的LP64架構上,對於現代OS X可可,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 
} 

在我看來,你需要傳遞一個參數,以可可或接收來自可可的結果和文檔說,數據類型是NSInteger你應該只使用NSInteger。在所有其他情況下:

  • 如果您不關心類型的寬度,請使用C類型,例如intlong
  • 如果您確實在意類型的寬度,請使用C99 stdint.h類型,例如int32_tint64_t
  • 如果你需要一個int保證大到足以容納一個指針,使用intptr_tuintptr_t
+0

另外,如果您需要兩個指針之間的差異,則應該使用'ptrdiff_t',而對於內存中對象的大小,'size_t'是適當的。而對於磁盤上文件的偏移量,'off_t'。所有這些都是基本的C東西,真的。 – alastair 2011-05-19 11:37:30

+0

@alastair:完全同意 – JeremyP 2011-05-19 14:14:29

2

我想說的指針大小的整數使用標準C99 uintptr_t的。 NSInteger的定義看起來足夠多雲,不能確定它保證有指針。

如果必須的話,在API使用它的地方使用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 
+1

不,使用'uintptr_t'或'intptr_t'指針大小的整數。 – alastair 2011-05-19 11:36:08

+0

謝謝,我也是C++ - 98(在這種情況下錯了)。答案已調整。 – 2011-05-19 12:34:56

相關問題