从Objective-C发送消息并获取返回值?

时间:2010-05-22 15:26:13

标签: objective-c cocoa

我有这段代码

   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;
}

1 个答案:

答案 0 :(得分:3)

你绝对确定response不是零吗?如果您向Google或其他地方提出的请求失败,则响应将设置为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有一种机制告诉你它使用了什么字符编码。我认为这是标题内容传输编码,但我建议您使用Google RFC来确定。

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