受苹果的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传递给此东西,并使其异步地延迟加载图像。 -!

所以这是问题...我该如何释放downloader?我认为我不能从创建它的ViewController中使用autorelease,因为我不希望NSURLConnection在运行循环结束时调用其委托。我可以在self末尾释放connectionDidFinishLoading吗?我从未见过这样的事情,感觉有点怪异地用一种自己的方法来释放自己。

我的另一个想法是,我可以使它成为一个单例,而不必担心它会一直缠绕直到我们终止。但是,我宁愿让物体栩栩如生,干净地消失。

顺便说一句,我聪明的下一步将是将此功能添加为UIImageView的类别。调用[imageView asynchronouslyLoadImageFromURL:(NSURL *)url]有点好。

最佳答案

您总是可以在[self retain]方法中放入-startDownloadWithImageView:andImageURL:,在[self release]方法中放入-connectionDidFinishLoading:。显然,它是非常规的,但是您可以在创建它后自动释放它,而不必担心它会被过早杀死。

关于iphone - 便利类的内存管理,以执行异步Web请求,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2882532/

10-10 23:07