我有一个相当简单的NSURLConnectionDelegate
包装器类,用于处理应用程序的简单HTTP请求。
当这些请求返回时,它们会调用主视图控制器类中的后续委托方法,以通知我结果是否成功。
如果我在我的视图控制器中的一个方法中使用这些包装器,采用即发即弃方法,如:
- (void) Foo {
MySimpleRequest* request = [[MySimpleRequest alloc] initWithDelegate:self];
[request send];
}
一旦Foo
的退出,request
似乎就会被ARC清除,并且以后的委托方法永远不会被调用。
如果我将request
指针移动到类级别,它就会挂起并成功。
这是推荐的方法吗?我是否必须让成员vars保留每个请求,或者有没有一种方法可以在请求返回之前保持其生命周期?
您可以使用一个块从下载中返回数据,并让downloader类作为下载的委托,这样所有的委托方法都可以包含在该类中。我使用一个处理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);
}
}];
我希望始终保留对请求的"外部"引用。如果您不希望这样,我认为您可以在MySimpleRequest
类中创建一个对self的强引用。
请确保将其设置为零,否则很明显会出现内存泄漏。