2012-10-11 82 views
8

目前我正在編寫一個應用程序(Target iOS 6,ARC enabled),它使用JSON進行數據傳輸,核心數據用於永久存儲。 JSON數據是由PHP腳本通過json_encode從MySQL數據庫中生成的。NSJSONSerialization得到EXC_BAD_ACCESS

我的問題是,從某些表中的數據下面的代碼失敗:

- (NSDictionary *)executeFetch:(NSString *)query 
{ 
    NSURL *requesturl = [NSURL URLWithString:[query stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; 

    NSError *dataError = nil; 
    self.jsonData = [NSData dataWithContentsOfURL:requesturl options:kNilOptions error:&dataError]; 

    NSError *error = nil; 
    self.jsonSerializationResult = [NSJSONSerialization JSONObjectWithData:self.jsonData options:NSJSONReadingMutableContainers|NSJSONReadingMutableLeaves error:&error]; 

    return self.jsonSerializationResult; 

} 

程序總是與它說:self.jsonSerializationResult及儀器說,有一個殭屍線的EXC_BAD_ACCESS錯誤崩潰檢測。我知道,這意味着一些對象將消息發送到爲零,但我不能找出如何解決它......這就是儀器公司說:

# Address Category Event Type RefCt Timestamp Size Responsible Library Responsible Caller 
0 0xa1b8a70 CFString (mutable) Malloc 1 00:01.603.081 32 Foundation -[NSPlaceholderMutableString initWithBytesNoCopy:length:encoding:freeWhenDone:] 
1 0xa1b8a70 CFString (mutable) Release 0 00:01.603.137 0 Foundation newJSONValue 
2 0xa1b8a70 CFString (mutable) Zombie -1 00:01.603.259 0 Foundation newJSONString 

我計劃與每一個JSON除了這一個輸出:

{ 
    "termin":[ 
     { 
     "termin_id":"17", 
     "veranstaltung_id":"20", 
     "beginn":"2012-09-28 17:00:00", 
     "ende":"2012-09-28 18:00:00", 
     "freie_pl\u00e4tze":null 
     }, 
     { 
     "termin_id":"18", 
     "veranstaltung_id":"26", 
     "beginn":"2012-09-28 19:00:00", 
     "ende":"2012-09-28 20:00:00", 
     "freie_pl\u00e4tze":null 
     }, 
     { 
     "termin_id":"19", 
     "veranstaltung_id":"26", 
     "beginn":"2012-09-28 21:00:00", 
     "ende":"2012-09-28 22:00:00", 
     "freie_pl\u00e4tze":null 
     }, 
     { 
     "termin_id":"20", 
     "veranstaltung_id":"46", 
     "beginn":"2012-09-28 19:00:00", 
     "ende":"2012-09-28 20:00:00", 
     "freie_pl\u00e4tze":null 
     }, 
     { 
     "termin_id":"24", 
     "veranstaltung_id":"66", 
     "beginn":"2012-09-28 22:00:00", 
     "ende":"2012-09-28 22:30:00", 
     "freie_pl\u00e4tze":"120" 
     } 
    ] 
} 

我想過來源的一些可能的錯誤,但沒有一個似乎是負責:

  • jsonData或jsonSerializationResult可能是零,但實際上卻
  • PHP中產生的無效JSON:檢查與驗證程序
  • NULL值:不與其他表

有沒有人有一個想法的問題?

回答

11

它看起來像一個缺陷/缺點NSJSONSerialization。該問題是由轉義的Unicode字符引起的(freie_pl\u00e4tze而不是freie_plätze)。您有兩個選項 -

  1. 將轉義的Unicode轉換爲真正的Unicode字符。嘗試this SO answer
  2. 使用另一個JSON引擎,如JSONKitJSONKit也聲稱比NSJSONSerialization更高性能。
+0

非常感謝!這是我在檢查失敗數據和工作數據之間的差異時沒有改變的唯一...令人驚訝的是,轉義字符似乎只是字典鍵的問題,而不是值... –

+0

順便說一句,我只看到這個,如果我使用'NSJSONReadingMutableContainers | NSJSONReadingMutableLeaves'選項。這也是你的經歷嗎? – Rob

+0

來自'AFNetworking'代碼註釋的Hello。 :) 謝謝,它真的有幫助! – skywinder

4

我知道這個問題已經得到解答,但我認爲一些初學者可能和我有同樣的問題,並被帶到這個問題。

EXC_BAD_ACCESS消息是由格式錯誤的JSON引起的。正如我不小心使用相同的名稱的對象,導致JSON轉換成字典時出現問題。

惱人的是,它沒有帶來格式錯誤。這裏是JSON的一個例子是導致此問題:

"levels" : { 
    "level1": { 
     .... 
    }, 
    "level1": { 
     ... << All objects should have different names. This should be called level2. 
    }, 
    "level3": { 
     ... 
    } 

要解決我必須確保同一級別的所有對象有不同名稱的問題。

1

今天剛剛測試了NSJSONSerialization。使用iOS 7.1。這是工作。沒有發現問題。看起來像Apple解決了這個問題。

NSString* jsonString = @"{ \"freie_pl\\u00e4tze\":null}"; 

NSData* jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding]; 

NSError *error = nil; 
NSDictionary* jsonSerializationResult = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers|NSJSONReadingMutableLeaves error:&error]; 

NSLog(@"%@", jsonSerializationResult);