我正在跟随this useful looking answer to my question。
它似乎有效,但我有两个问题:
更新: It considers any response a success。所以我想我必须在didRecieveResponse方法中处理HTTP错误,但除了告诉用户我遇到HTTP错误时出错,我是否需要以某种方式停止连接?和/或清理?
[[NSURLConnection alloc] initWithRequest:request delegate:self];
我需要发布吗?在哪里,如何,何时?
答案 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提供错误状态代码时,调用委托的相应方法并停止连接。
这是一个很好的包装类示例
答案 1 :(得分:3)
是的,您需要释放该对象。请参阅Memory Management Programming Guide for Cocoa。基本上,如果您创建的方法名称以alloc
或new
或包含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)。