2015-03-18 72 views
0

我有一个相当简单的NSURLConnectionDelegate包装类处理简单的HTTP请求我的应用程序。iOS ARC最佳实践火和忘记ASYNC包装

当这些请求返回时,它们会调用我的主视图控制器类中的后续委托方法来通知我结果是否成功。

如果我把一个发射后不管的做法在我的视图控制器使用方法内这些包装,像这样:

- (void) Foo { 
    MySimpleRequest* request = [[MySimpleRequest alloc] initWithDelegate:self]; 
    [request send]; 
} 

只要Foo的退出,request似乎被清理通过ARC和后续的委托方法永远不会被调用。

如果我将我的request指针移动到类级别,它会挂起并成功。

这是推荐的方法吗?我是否必须让成员变量保持每个请求,还是有一种方法可以在请求返回之前保持其生命周期一直活着?

回答

2

您可以使用块从下载中返回数据,并让下载器类成为下载的委托,以便所有委托方法都可以包含在该类中。我使用一个处理NSURLConnection的类,并从didFailWithError或connectionDidFinishLoading:中调用完成块。下载器类在块被执行后被释放。我这样称呼它从视图控制器,

Downloader *dl = [Downloader new]; 
    NSURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://www.wswd.net/testdownloadfiles/20MB.zip"]] cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData timeoutInterval:10]; 

    [dl downloadWithRequest:request completion:^(NSData *data, NSError *error) { 
     if (data) { 
      // do whatever you need to do with the raw data here 
      NSLog(@"got the data"); 
     }else{ 
      NSLog(@"%@",error); 
     } 
    }]; 
1

我宁愿始终保留对请求的“外部”引用。如果你不想要这个,我认为你可以在MySimpleRequest这个课堂里为自己创建一个有力的参考。

确保将其设置为零,否则显然会导致内存泄漏。