轉自:http://chensmiles.blog.163.com/blog/static/121463991201296101228806/
If you’ve ever found yourself scratching your head thinking “now which one should I be using, NSNumber or NSInteger?” the short summary below should help.
NSInteger is nothing more than a synonym for a long integer. What follows is how NSInteger is defined:
1 2 3 4 5 6 7 |
#if __LP64__ || NS_BUILD_32_LIKE_64 typedef long NSInteger; typedef unsigned long NSUInteger; #else typedef int NSInteger; typedef unsigned int NSUInteger; #endif |
NSNumber is an Objective-C class, a subclass of NSValue to be specific. You can create an NSNumber object from a signed or unsigned char, short int, int, long int, long long int, float, double or BOOL.
One of the primary distinctions is that you can use NSNumber in collections, such as NSArray, where an object is required. For example, if you need to add a float into an NSArray, you would first need to create an NSNumber object
from the float:
1 2 3 4 |
float percentage = 40.5; ... // Create NSNumber object, which can now be inserted into an NSArray NSNumber *percentageObject = [NSNumber numberWithFloat:percentage]; |
NSInteger is a simply an integer, NSNumber is an object.
以上轉至:http://mobiledevelopertips.com/cocoa/nsnumber-and-nsinteger.html
附錄:
#if __LP64__ || TARGET_OS_EMBEDDED || TARGET_OS_IPHONE || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64
typedef long NSInteger;
#else
typedef int NSInteger;
#endif
這篇介紹幾種變數類型的區別和注意點,雖然簡單.但比較實用.
1、當需要使用int類型的變數的時候,可以像寫C的程式一樣,用int,也可以用NSInteger,但更推薦使用NSInteger,因為這樣就不用考慮裝置是32位的還是64位的。
2、NSUInteger是無符號的,即沒有負數,NSInteger是有符號的。
3、有人說既然都有了NSInteger等這些基礎類型了為什麼還要有NSNumber?它們的功能當然是不同的。
NSInteger是基礎類型,但是NSNumber是一個類。如果想要儲存一個數值,直接用NSInteger是不行的,比如在一個Array裡面這樣用:
NSArray *array= [[NSArray alloc]init];
[array addObject:3];//會編譯錯誤
這樣是會引發編譯錯誤的,因為NSArray裡面放的需要是一個類,但‘3’不是。這個時候需要用到NSNumber:
NSArray *array= [[NSArray alloc]init];
[array addObject:[NSNumber numberWithInt:3]];
Cocoa提供了NSNumber類來封裝(即以對象形式實現)基礎資料型別 (Elementary Data Type)。
例如以下建立方法:
+ (NSNumber*)numberWithChar: (char)value;
+ (NSNumber*)numberWithInt: (int)value;
+ (NSNumber*)numberWithFloat: (float)value;
+ (NSNumber*)numberWithBool: (BOOL) value;
將基本類型資料封裝到NSNumber中後,就可以通過下面的執行個體方法重新擷取它:
- (char)charValue;
- (int)intValue;
- (float)floatValue;
- (BOOL)boolValue;
- (NSString*)stringValue;
#if __LP64__ || (TARGET_OS_EMBEDDED && !TARGET_OS_IPHONE) || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64typedef long NSInteger;typedef unsigned long NSUInteger;#elsetypedef int NSInteger;typedef unsigned int NSUInteger;#endif
這是NSInteger的定義
對於不同平台32,64位有不同的最大值(int long)。
可以直接轉化。
所以mac os或者ios上的系統api都是使用NSInteger作為參數