用于执行异步Web请求的便捷类的内存管理

时间:2010-05-21 13:41:27

标签: iphone cocoa memory-management

受到Apple的LazyTables示例的启发,我刚刚建立了一个名为ImageLoader的类。这让我很痛苦。正如我经常非常聪明的情况一样,我正在反对我如何处理这个对象的记忆的智慧。

事物从viewDidLoad中的UIViewController子类实例化,因此:

ImageDownloader *downloader = [[ImageDownloader alloc] init];
[downloader startDownloadWithImageView:self.theImageView
                           andImageURL:[NSURL URLWithString:myUrlString]];

在ImageDownloader中的那个方法中,我去了:

-(void)startDownloadWithImageView:(UIImageView *)imageView
                      andImageURL:(NSURL *)url
{
 self.theImageView = imageView;
 [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
 self.activeDownload = [NSMutableData data];

 NSURLConnection *conn = [[NSURLConnection alloc]
  initWithRequest:[NSURLRequest requestWithURL:url] delegate:self];
 self.imageConnection = conn;
 [conn release];
}

和我作为NSURLConnectionDelegate的委托方法是(相关部分):

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{  
 UIImage *image = [[UIImage alloc] initWithData:self.activeDownload];
 theImageView.image = image;
 [image release];
}

显然有各种各样的错误检查它还没有,但你获得了它的光彩,对吗?我现在可以将这个东西传递给UIImageView和NSURL,并让它以异步方式延迟加载图像。萨-weet!

所以这就是问题......我如何发布downloader?我不认为我可以从我创建它的ViewController中autorelease,因为我不希望NSURLConnection在运行循环结束时调用它的委托。我可以在self结尾处发布connectionDidFinishLoading吗?我从未见过这样做过,在自己的方法中释放自己感觉有点奇怪。

我的另一个想法是,我可以把它变成一个单身,而不是担心它会一直存在直到我们终止。但是我宁愿让这个物体变得生动,干净利落地走开。

顺便说一下,我聪明的下一步是将此功能添加为UIImageView的一个类别。打电话给[imageView asynchronouslyLoadImageFromURL:(NSURL *)url]会很好。

1 个答案:

答案 0 :(得分:2)

您始终可以在[self retain]方法中添加-startDownloadWithImageView:andImageURL:,在[self release]方法中添加-connectionDidFinishLoading:。显然,这是非常规的,但是这样可以让你在创建它之后自动释放它而不用担心它会过早被杀死。