2010-05-22 51 views
0

我有这样的代码从Objective-C发送消息并获取返回值?

NSString *tr = [self sendUrl:@"http://google.com/"]; 

但出于某种原因“TR”仍将执行完成后为零。我究竟做错了什么?

sendUrl:

- (NSString *)sendUrl:(NSString *) uri { 

NSLog(@"Requesting URI 1 ..."); 

// Prepare URL request to download statuses from Twitter 
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:uri]]; 

NSLog(@"Requesting URI 2 ..."); 

// Perform request and get JSON back as a NSData object 
NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; 

NSLog(@"Requesting URI 3 ..."); 

// Get JSON as a NSString from NSData response 
NSString *json_string = [[NSString alloc] initWithData:response encoding:NSUTF8StringEncoding]; 

NSLog(@"Requesting URI 4 ..."); 

return json_string; 
} 
+0

sendUrl的实现是什么:? – BoltClock 2010-05-22 15:30:25

+0

看起来很好。你是否100%确定你的sendUrl函数正在工作 - 分步执行代码并向你自己证明。 – blissapp 2010-05-22 15:30:25

+0

sendUrl不是内置方法,是不是?我无法搜索它?你可以给我链接到方法描述/文档。没有这些,我不知道会发生什么 – vodkhang 2010-05-22 15:31:32

回答

3

你绝对肯定response不是零?如果您的请求,以谷歌或其他地方失败,响应将被设置为nil和错误会包含一些信息,帮助您诊断错误,以便改变

NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; 

NSError* error = nil; 
NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:&error]; 
if (response == nil) 
{ 
    NSLog(@"request failed with error %@", error); 
    // any other error handling 
} 

接下来的事情。 HTTP消息的默认编码是ISO-8859-1,而不是UTF-8。根据Apple的文档,如果编码错误,-initWithData将返回nil。你可能是想要NSISOLatin1StringEncoding。我说“可能”,因为HTTP有一种机制来告诉你它使用了什么字符编码。我认为它是Content-Transfer-Encoding的头文件,但我建议你通过HTTP HTTP来确认。

最后如果json_string不是零,它会泄漏。因为你用alloc获得它,所以你拥有它,这意味着你需要在从sendURL返回它之前自动释放它:最后一点不是你的问题的原因,它是你的代码中的一个单独的错误。

相关问题