OC NSNumber NSInteger 直接賦值問題

一 問題描述

類對象的屬性id類型是NSNumber ,設置UI 的 tag(NSInteger類型)時候,數據失真。atom

id屬性是1,tag 取出來爲19。
spa


1.1 UI tag 屬性code

//
@property(nonatomic) NSInteger tag;


1.2 錯誤代碼以下對象

//tagNumber 是 NSNumber 類型
[button setTag:tagNumber];


1.3 修改代碼以下
get

//經過integerValue方法 中轉
[button setTag:[tagNumber integerValue]];


1.4 問題模擬it

//1.聲明 NSInteger 對象
NSInteger integer = 0;
        
//2.聲明 NSNumber 對象
NSNumber *number = [NSNumber numberWithInt:3];
        
integer = number;
        
NSLog(@"integer:%d",integer);
NSLog(@"integer:%ld",integer);

===設置的是 3 輸出的倒是非 3 
integer:50
integer:-5764607523034234830

注意:NSNumber 對象不能直接賦值給NSInteger 變量,會致使數據失真,須要經過方法中轉io


二 二者區別

NSInteger 是基本類型,是int類型的typedef,被typedef成long(64位) 和的int(32位class

NSNumber 是類,包含多種數據類型的對象,提供多個方法來初始化對象,和其餘操做方法變量

NSNumber.h頭文件數據類型

- (NSNumber *)initWithChar:(char)value NS_DESIGNATED_INITIALIZER;
- (NSNumber *)initWithUnsignedChar:(unsigned char)value NS_DESIGNATED_INITIALIZER;
- (NSNumber *)initWithShort:(short)value NS_DESIGNATED_INITIALIZER;
- (NSNumber *)initWithUnsignedShort:(unsigned short)value NS_DESIGNATED_INITIALIZER;
- (NSNumber *)initWithInt:(int)value NS_DESIGNATED_INITIALIZER;
- (NSNumber *)initWithUnsignedInt:(unsigned int)value NS_DESIGNATED_INITIALIZER;
- (NSNumber *)initWithLong:(long)value NS_DESIGNATED_INITIALIZER;
- (NSNumber *)initWithUnsignedLong:(unsigned long)value NS_DESIGNATED_INITIALIZER;
- (NSNumber *)initWithLongLong:(long long)value NS_DESIGNATED_INITIALIZER;
- (NSNumber *)initWithUnsignedLongLong:(unsigned long long)value NS_DESIGNATED_INITIALIZER;
- (NSNumber *)initWithFloat:(float)value NS_DESIGNATED_INITIALIZER;
- (NSNumber *)initWithDouble:(double)value NS_DESIGNATED_INITIALIZER;
- (NSNumber *)initWithBool:(BOOL)value NS_DESIGNATED_INITIALIZER;
- (NSNumber *)initWithInteger:(NSInteger)value NS_AVAILABLE(10_5, 2_0) NS_DESIGNATED_INITIALIZER;
- (NSNumber *)initWithUnsignedInteger:(NSUInteger)value NS_AVAILABLE(10_5, 2_0) NS_DESIGNATED_INITIALIZER;


參考stackoverflowNSNumber NSInteger 二者其別


三 互轉方法

//把int 轉換成NSNumber
NSNumber *aNumber = [NSNumber numberWithInteger:21];

//把NSNumber 對象轉換成 NSInteger
NSInteger anInteger = [aNumber integerValue];
相關文章
相關標籤/搜索