受苹果的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/