2014-03-27 47 views
0

我有一個應用程序在32位平臺上工作,但在64位設備和模擬器上運行時會引發錯誤。有問題的代碼是:如何解決iOS 64位錯誤

if ([lastStatus isEqualToString:@"0"]){ //EXC_BAD_ACCESS 
       bRetVal = YES; 
      } 

從我的H級文件:

@interface DPXmlHandler : NSObject <NSXMLParserDelegate> { 
    NSString *lastStatus; 
    NSString *msg; 
    NSMutableArray * locs; 
    NSMutableArray *alerts; 
    NSMutableArray *mrmMsgs; 
    } 
@property (nonatomic, copy) NSString *lastStatus; 

我合成lastStatus在我的.m文件的頂部。我使用XML文件中的值填充字符串。 - (無效)解析器:(的NSXMLParser *)解析器 didStartElement:(的NSString *)的ElementName 的namespaceURI:(的NSString *)的namespaceURI 的qualifiedName:(的NSString *)QNAME 屬性:(的NSDictionary *)attributeDict {

if ([elementName isEqual:@"status"]) { 
    //Get attribute value 
    @try{ 
     lastStatus = [attributeDict valueForKey:@"code"]; 
     msg = [attributeDict valueForKey:@"message"]; 
    }@catch (NSException *e){ 
     NSLog(@"Exception: %@", e); 
     msg = e.name; 
    } 

該值是一個整數,但我無法理解爲什麼我不能存儲一個「0」字符串並將其與@「0」進行比較。我將不勝感激任何有關如何改變這一點的見解。 lastStatus的值大致爲-100至100.我可以使lastStatus爲int或long並使用==運算符,但我似乎無法找到任何指導原因,因爲這是一個問題。

我查了蘋果的guide on converting apps to 64 bit,但沒有提到NSString。

+1

也許檢查'[attributeDict valueForKey:@「code」]'實際上是一個字符串,可能會發生一些奇怪的事情 – Fonix

+0

讓我猜測,你不使用ARC。 –

回答

1

避免直接使用實例變量,而是使用屬性。

if ([elementName isEqual:@"status"]) { 
    //Get attribute value 
    @try{ 
     self.lastStatus = [attributeDict valueForKey:@"code"]; 
     self.msg = [attributeDict valueForKey:@"message"]; 
    }@catch (NSException *e){ 
     NSLog(@"Exception: %@", e); 
     self.msg = e.name; 
    } 

因爲你的代碼不保留或複製對象,所以它們被自動釋放。

0

啊,當你說你可以做lastStatus和int或long,聽起來好像"code"這個鍵返回的值實際上是一個int或long類型,而不是NSString類型。 isEqualToString是NSString類的一個函數,所以如果你試圖將它與一個int或long比較,它不會工作。你可以把它轉到@([attributeDict valueForKey:@"code"]).stringValue

注很容易地轉換:@()是一個NSNumber,@「」是一個NSString

編輯

對不起,你不能實際存儲整數或多頭在字典自己,因爲他們需要的NSObject的是能夠儲存,所以也許他們已經在那裏NSNumbers,那麼你可以使用.stringValue的對象本身

+0

謝謝你,我嘗試了這兩種解決方案,Cy-4AH讓我的速度更快。我在@([attributeDict valueForKey:@「code」])。stringValue上有一個語法錯誤,所以我只是用最快的路徑走向勝利。 – ja928