2010-08-01 79 views
17

我有下面的代碼位:stringWithUTF8String失敗了,但只是有時

NSData *data = [NSData dataWithContentsOfFile:filePath options:0 error:&fileError]; 
NSString *recipe = @""; 
if (fileError == nil) { 
    recipe = [NSString stringWithUTF8String:[data bytes]]; 
    NSLog(@"Converted Recipe as: %@",recipe); 
    NSLog(@"Original Data was: %@",data); 
} else { 
    NSLog(@"Error reading file: %@", [fileError localizedDescription]); 
} 

的問題是,有時stringWithUTF8String返回null,有時它正確返回文件的內容......相同的文件。有時它有效,有時不起作用。這是從日誌中的一個片段,當它不是......這意味着文件讀取正在工作,但由於某種原因,這次轉換失敗了。如果我再這樣做(這被稱爲一個的tableView didSelectRowAtIndexPath方法的結果是:這樣我就可以點擊不同的行,然後回來這個

2010-08-01 16:14:29.031 RecipeBrowse[52056:207] Converted Recipe as: (null) 
2010-08-01 16:14:29.037 RecipeBrowse[52056:207] Original Data was: <426c6163 6b656e65 64204361 626f2046 69736820 5461636f 730a0a49 4e475245 4449454e 54533a0a 0a2d200a 0a0a4d45 54484f44 3a0a0a42 4c41434b 454e4544 20434142 4f204649 53482054 41434f53 

任何想法如何使這更可靠。 ?

+3

返回並閱讀有關錯誤處理的文檔。切勿測試錯誤是否爲非零;總是測試返回值(在這種情況下是數據)。 – 2010-08-02 09:29:52

回答

32

+stringWithUTF8String:將假定其輸入是一個NULL結尾的字符串,但NSData的不把任何特定的終止有,而是創建一個使用-initWithBytes:length:encoding:您的字符串,因爲你知道數據的長度。

+6

或'initWithData:encoding:'。 – Wevah 2010-08-01 23:39:51

+0

+1 @ Wevah:沒錯,我錯過了那一個。 – JWWalker 2010-08-01 23:54:15

+0

輝煌,謝謝!這似乎已經清除了它。 – 2010-08-02 00:45:40

5

有同樣的問題,initWithData:數據適用於我

- (NSString *)base64String { 
    NSData * data = [UIImagePNGRepresentation(self) base64EncodedDataWithOptions:NSDataBase64Encoding64CharacterLineLength]; 
    return [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 
} 
相關問題