2015-08-26 44 views
1

當我在iPhone 5s或更高版本上運行這段代碼時,它按預期執行。但是當我在低於5s(5,4s,4)的版本上運行它時,它不會。代碼在iPhone 5s +上運行良好,而不是以前的版本?

它應該進入第一個if語句,忽略第二個if語句並執行else。這在模擬器中超過5s的任何版本都可以正常工作,但是當我在5或4上運行它時,它將進入第二個if語句...而不是忽略它並執行else。

currentProduct.productID是一個NSNumber

任何可以幫助我將非常感激!

NSNumber *currentProductID = [[NSNumber alloc] initWithInt:4121]; 

if (productPurchased != YES) { 
    if (currentProduct.productID != currentProductID) { 
     [self performSegueWithIdentifier:@"InAppPurchaseViewController" sender:nil]; 
    } else { 
     [self showActivityView]; 
     [self performSelector:@selector(configureExam) withObject:nil afterDelay:0.1]; 
    } 
+2

小心直接比較YES。這並不安全。 YES是一個特定的值。它可能導致誤報。您應該以'if(!productPurchased)'來進行比較。與您的問題無關,但仍需注意。 –

回答

1

不能使用!=(或==)來比較兩個對象。

更改if到:

if (![currentProduct.productId isEqual:currentProductID]) { 

在一個側面說明,用現代語法創建的數量:

NSNumber *currentProductID = @4121; 
+0

你是神! – MrDevRI

+0

不,謝謝。很高興我能幫上忙。 – rmaddy

1

比較NSNumber你可以使用

  1. compare:它返回NSComparisonResult

    NSNumber *currentProductID = @4121; 
    if ([currentProduct.productId compare:currentProductID] != NSOrderedSame) { 
    } 
    
  2. isEqualToNumber:

    NSNumber *currentProductID = @4121; 
    if (![currentProduct.productId isEqualToNumber:currentProductID]) { 
    } 
    
  3. intValue,它就像你做了什麼比較。

    NSNumber *currentProductID = @4121; 
    if ([currentProduct.productId intValue] != [currentProductID intValue]) { 
    } 
    
+0

這與32位和64位無關。這很簡單,就是錯誤地使用'!='來比較兩個對象。順便說一句 - 在選項#3中,爲什麼要把'currentProductID'變成'NSNumber'呢?只需將'[currentProduct.productId intValue]'直接與'4121'進行比較即可。 – rmaddy

+0

感謝您澄清關於64位。我會把這個答案拿出來。和選項#3。你是對的。可以使用int。 – thanyaj

+1

64位與代碼在5S上工作的事實有關,但它是不應該依賴的實現細節:使用上述答案是正確的。只是爲了記錄,在64位,大多數整數NSNumbers使用獨特的標籤指針,從而程序工作。 – Julien

0

我有同樣的問題,並從NSNumbers提取整數值固定,然後對它們進行比較。像下面一樣

if ([currentProduct.productID integerValue] != [currentProductID integerValu]) { 
相關問題