从iPhone应用程序发出GET和POST请求 - 需要澄清

时间:2009-01-10 21:44:15

标签: iphone cocoa-touch http networking

我正在跟随this useful looking answer to my question

它似乎有效,但我有两个问题:

  1. 如何检测HTTP错误?似乎没有调用didFailWithError方法?
  2. 更新: It considers any response a success。所以我想我必须在didRecieveResponse方法中处理HTTP错误,但除了告诉用户我遇到HTTP错误时出错,我是否需要以某种方式停止连接?和/或清理?

    1. 我在答案中看到这一行:
    2. [[NSURLConnection alloc] initWithRequest:request delegate:self];
      

      我需要发布吗?在哪里,如何,何时?

3 个答案:

答案 0 :(得分:4)

您将获得didReceiveResponse

中返回的状态代码
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{
    NSHTTPURLResponse *httpResponse;
    httpResponse = (NSHTTPURLResponse *)response;
    int statusCode = [httpResponse statusCode];
    //statusCode will be the http code returned like 201,500
 }

要停止连接,请使用类级变量进行连接。最好的方法是创建一个发送请求和接收响应的包装器。使viewcontroller成为此类的委托,每当didReceiveResponse提供错误状态代码时,调用委托的相应方法并停止连接。

这是一个很好的包装类示例

http://kosmaczewski.net/projects/objective-c-rest-client/

答案 1 :(得分:3)

是的,您需要释放该对象。请参阅Memory Management Programming Guide for Cocoa。基本上,如果您创建的方法名称以allocnew或包含copy开头,则您将成为该对象的所有者,并负责在以后释放该对象。只有在你知道你需要该对象直到程序终止的情况下才可以不释放它,在这种情况下,操作系统会在你的应用程序终止时回收内存。

如果您只需要小范围内的对象,则可以向其发送autorelease消息。这会将其添加到自动释放池中。自动释放池会定期向其中的每个对象发送release消息。这有点复杂;请参阅autorelease pools部分。例如:

在这种情况下,由于NSURLConnection是异步的,因此自动释放不起作用。您不确切知道它何时会使用数据回调到您的对象,因此您要确保该对象尚未发布。唯一可以确定的方法是确切知道对象何时完成,然后自己发送release消息。

所有各种init*函数都返回指向给定对象的指针,因此您可以这样做:

NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
...
// when done with connection:
[connection release];

答案 2 :(得分:0)

在“更新”中回答问题......

立即自动释放NSURLConnection。连接对象由NSRunLoop保留(除非您使用startImmediately:NO构造函数,否则它会自动添加它)。它将在错误或完成时自动从运行循环中移除(因此dealloc'd)。