使用NSURLConnection的自定义子类,它如何在以后"找到"类中的其他数据?

cks*_*ubs 6 inheritance cocoa objective-c

此博客为处理多个NSURLConnections提供了一个很好的解决方案:创建一个具有附加tag属性的自定义"CustomURLConnection"类.

http://blog.emmerinc.be/index.php/2009/03/02/custom-nsurlconnection-class-with-tag/

http://blog.emmerinc.be/index.php/2009/03/15/multiple-async-nsurlconnections-example/

基本上,他只是tag在现有的NSURLConnection中添加了一个属性:

CustomURLConnection.m

- (id)initWithRequest:(NSURLRequest *)request delegate:(id)delegate startImmediately:(BOOL)startImmediately tag:(NSString*)tag {
   self = [super initWithRequest:request delegate:delegate startImmediately:startImmediately];

   if (self) {
      self.tag = tag;
   }
   return self;
}
Run Code Online (Sandbox Code Playgroud)

那么,以后在正常的NSURLConnection加载方法中,你可以这样做:

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {

   //Log the connection’s tag
   CustomURLConnection *ttttag = (CustomURLConnection *)connection; // **HERE**
   NSLog(@”%@”, ttttag.tag);


   NSMutableData *dataForConnection = [self dataForConnection:(CustomURLConnection*)connection];
   [connection release];
}
Run Code Online (Sandbox Code Playgroud)

所以,那就是我遇到麻烦的地方.我看待它的方式,这就是事情的发展方向:

  • 我创建了一个"连接+标签"
  • 我上面发布的第一个代码片段创建了一个常规的"连接"(no tag),最终会调用正常的NSURLConnection方法connectionDidFinishLoading.tag到目前为止会发生什么?
  • connectionDidFinishLoading方法中,我能够将连接转换回"连接+标记",然后找到丢失的标记信息.怎么样?

也许我只是让自己感到困惑,但似乎tag当它从正常NSURLConnection路径开始时被丢弃了.但是通过将其作为子类,我再次能够恢复tag属性.它在哪里生活/去的同时?

对继承有更好理解的人能解释一下吗?

Ole*_*ann 4

有了这个代码:

[[CustomURLConnection alloc] initWithRequest:... delegate:... startImmediately:... startImmediately tag:...];
Run Code Online (Sandbox Code Playgroud)

您创建了一个实例CustomURLConnection。现在,您的理解是错误的:该CustomURLConnection对象可以自由调用其超类的所有方法,但它将始终保持为CustomURLConnection. 总是tag在那里。

超类中定义的方法(例如)initWithRequest:delegate:startImmediately:不知道标签,但它们也不必知道。当委托方法被调用时:

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
Run Code Online (Sandbox Code Playgroud)

connection论点与您在上面创建的论点完全相同。 CustomURLConnection方法签名中的类型不同,但这并不重要;因为您知道此连接的类型CustomURLConnection,所以您可以将connection对象转换为正确的类型并访问新属性。但即使你不这样做,它们tag仍然会一直存在。