2009-07-10 16 views
5

में वर्णों का पिछला भाग लिया था। मैंने वास्तव में यह पता लगाने के लिए संघर्ष किया है कि मेरा वेब सेवा कॉल जंक डेटा के साथ क्यों झुका हुआ है।NSURLConnection प्रतिनिधि ने डेटा

मेरे पास एक UITableViewController है जो वेब सेवा को कॉल करता है और NSURLConnectionDelegate के रूप में भी कार्य करता है।

यहां ब्याज की प्रतिनिधि विधि है, एनएसएलओजी स्टेटमेंट्स पर ध्यान दें।

2009-07-10 09:04:20.339 SundialInvoice[91493:20b] data {"items": [], "request": 

"/inventory/delivered.json"} 
2009-07-10 09:04:20.339 SundialInvoice[91493:20b] before 
2009-07-10 09:04:20.340 SundialInvoice[91493:20b] after {"items": [], "request": "/inventory/delivered.json"} SundialInvoice] [PID 

2009-07-10 09:04:23.153 SundialInvoice[91493:20b] data {"items": [], "request": "/inventory/delivered.json"}l 4] [Mes 
2009-07-10 09:04:23.154 SundialInvoice[91493:20b] before 
2009-07-10 09:04:23.154 SundialInvoice[91493:20b] after {"items": [], "request": "/inventory/delivered.json"} SundialInvoice] [PID 

2009-07-10 09:04:27.913 SundialInvoice[91493:20b] data (null) 
2009-07-10 09:04:27.913 SundialInvoice[91493:20b] before 
2009-07-10 09:04:27.914 SundialInvoice[91493:20b] after {"items": [], "request": "/inventory/delivered.json"} SundialInvoice] [PID 

2009-07-10 09:04:30.486 SundialInvoice[91493:20b] data {"items": [], "request": "/inventory/delivered.json"}ice/1.0 CFN 
2009-07-10 09:04:30.487 SundialInvoice[91493:20b] before 
2009-07-10 09:04:30.487 SundialInvoice[91493:20b] after {"items": [], "request": "/inventory/delivered.json"} SundialInvoice] [PID 

अनुगामी कचरा डेटा कहाँ से आ रहा है:

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { 
    NSLog(@"data %@", [[NSString alloc] initWithUTF8String: [data bytes]]); 
    NSLog(@"before %@", [NSString stringWithUTF8String: self.rawData.bytes]); 
    [self.rawData appendData:data]; 
    NSLog(@"after %@", [NSString stringWithUTF8String: self.rawData.bytes]); 
} 

यहाँ प्रयास की संख्या के बाद, जिसके परिणामस्वरूप लॉग है? मैंने कई बार कर्ल के साथ वेब सेवा चलाई है और कचरा इससे नहीं आ रहा है।

उत्तर

6

मुझे लगता है कि कचरा प्रवेश से आता है:

[NSString stringWithUTF8String:self.rawData.bytes] 

यहाँ आप कह रहे हैं कि आप इस सी-स्ट्रिंग से एक NSString (= सरणी बाइट्स की शून्य द्वारा समाप्त) चाहते हैं। समस्या यह है कि bytesNSDataकी विधि शून्य द्वारा समाप्त डेटा लौटा नहीं है, क्योंकि यह एक सामान्य सरणी है, सी-स्ट्रिंग नहीं। इसलिए NSString प्रारंभकर्ता NSData के अंत के बाद भी बाइट्स को पकड़ता है, जब तक यह स्मृति में पहले से संग्रहीत कुछ शून्य बाइट तक नहीं पहुंच जाता।

1

निम्न प्रयास करें:

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { 
    [rawData appendData:data]; 
} 

- (void)connectionDidFinishLoading:(NSURLConnection *)connection 
{ 
    NSLog(@"%@",rawData); 
} 

इसके अलावा क्या आप के रूप में rawData घोषणा की है ???

11

एक NSData से एक NSString बनाने के लिए, आप initWithData:encoding: का उपयोग करना चाहिए, निम्नलिखित की तरह:

NSString *str = [[NSString alloc] initWithData:self.rawData 
             encoding:NSUTF8StringEncoding]; 
NSLog(@"Before: %@", str); 
[str release]; 

इलाज NSData बाइट के रूप में सी स्ट्रिंग कुछ सुरक्षा कमजोरियों के कारण हो सकता।

संबंधित मुद्दे