2014-04-09 28 views
1

我正在編碼,並跑過這個..隱式轉換在創建應用程序時失去整數精度'NSUInteger'(又名'unsigned long')爲'int'?

我不明白爲什麼會發生這種情況,我需要幫助,有人可以幫忙嗎? :)

- (void)viewDidLoad 
{ 
Start = YES; 
Obstacle.hidden = YES; 
Obstacle2.hidden = YES; 
Bottom1.hidden = YES; 
Bottom2.hidden = YES; 
Bottom3.hidden = YES; 
Bottom4.hidden = YES; 
Bottom5.hidden = YES; 
Bottom6.hidden = YES; 
Bottom7.hidden = YES; 
Top1.hidden = YES; 
Top2.hidden = YES; 
Top3.hidden = YES; 
Top4.hidden = YES; 
Top5.hidden = YES; 
Top6.hidden = YES; 
Top7.hidden = YES; 

Heli.center = CGPointMake(48, 145); 

HighScore = [[NSUserDefaults standardUserDefaults] integerForKey:@"HighScoreSaved"]; < issue HERE 

Intro3.text = [NSString stringWithFormat:@"High Score: %i", HighScore]; 

回答

5

integerForKey返回NSUInteger值(又名無符號長整數)。我假設你的HighScore變量是一個int,它的字節少於long。嘗試投射到int:

HighScore = (int)[[NSUserDefaults standardUserDefaults] integerForKey:@"HighScoreSaved"]; 
0

我猜這是在你的倒數第二行。 integerForKey:返回一個NSUInteger(無符號長整型),並且HighScore可能被聲明爲一個int(在代碼中不顯示該聲明)。要麼使用(int)明確地轉換它,要麼將其作爲int存儲在用戶默認值(intForKey:)中。祝你好運!

0

如果您包含了HighScore的聲明,但是我會認爲它是int,這本來是不錯的,因爲這是您遇到麻煩的類型。當您將HighScore分配給-[NSUserDefaults integerForKey:]的結果時,您正在將類型NSUInteger的變量分配爲int。這是你問題的根源。由於NSUInteger鍵入的結果爲unsigned long,而long是一個數字的較大表示,因此在分配期間,您正在失去精度。我有兩個推薦。

@property (nonatomic) NSUInteger HighScore; // declare HighScore as NSUInteger 

/* or */ 

HighScore = (int)[[NSUserDefaults standardUserDefaults] integerForKey:@"HighScoreSaved"]; 

第一簡單地聲明瞭高分作爲NSUInteger,以避免在第一位置的問題,所述第二投射以適合其分配的方法的返回類型。

+1

n.b.把它聲明爲NSUInteger是一個好主意,但是一定要改變stringWithFormat中的字符串格式說明符,因爲%i不再做。 (我認爲它是%ul?我記得在XCode 5.1中有64位支持,我不得不換成一些奇怪的說明符並且使用NSUInteger來使這些可移植) – RobP

相關問題