2012-08-13 103 views
0

我想弄清楚爲什麼我通過此代碼獲得EXC_BAD_ACESS。我沒有clu。任何人都可以幫我解答。保留/釋放錯誤

- (void)loadJsonFile:(NSString*)fileName { 
   NSError *error = nil; 
   NSData *jsonData = [[[NSString alloc] 
                        initWithContentsOfFile:[[NSBundle mainBundle] 
                                                pathForResource:fileName ofType:@"json"] 
                        encoding:NSUTF8StringEncoding error:&error] 
                       dataUsingEncoding:NSUTF8StringEncoding]; 
    
   jsonDic = [[NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&error] retain]; 
    [jsonData release]; 
} 

如果我註釋掉 「[jsonData release];」 行,一切功能。但爲什麼 ?我分配jsonData,填入數據並將其傳遞到NSJSONSerialization獲取jsonDic。在序列化之後,我發佈了jsonData並希望使用jsonDic,但是在「[jsonData release];」之後的一段時間,我收到了「EXC_BAD_ACCESS」異常。

我沒有clu,任何幫助讚賞。

回答

2

你釋放jsonData,但你永遠不會保留它。靜態分析儀(菜單"Product" ➞ "Analyze")會告訴你這個問題。另外,您不會發布您正在分配的NSString

做這樣的:

- (void)loadJsonFile:(NSString*)fileName { 
    NSError *error = nil; 
    NSData *jsonData = [[[[[NSString alloc] 
         initWithContentsOfFile:[[NSBundle mainBundle] 
               pathForResource:fileName ofType:@"json"] 
         encoding:NSUTF8StringEncoding error:&error] autorelease] 
         dataUsingEncoding:NSUTF8StringEncoding] retain]; 

    jsonDic = [[NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&error] retain]; 
    [jsonData release]; 
} 

你可能要考慮使用ARC(自動引用計數)。 Xcode可以使用菜單"Edit" ➞ "Refactor" ➞ "Convert to Objective-C ARC…"幾乎完全自動轉換您的項目。只有幾個原因需要手動管理內存。

+0

Thx很多。我現在意識到 a)我創建了一個字符串對象,我從來沒有發佈過 b)我釋放了我沒有的數據對象。 – 2012-08-13 12:43:08

+0

您使用的是什麼版本的XCode?我正在使用3.2.5,並且我沒有在任何菜單中看到ARC ... – user574771 2012-08-15 21:00:12

+0

@ user574771 ARC需要Xcode 4.2或更新版本。 – 2012-08-16 08:42:56