Iphone 方便类进行异步web请求的内存管理
受苹果LazyTables示例的启发,我刚刚为自己构建了一个名为ImageLoader的类。我真是聪明得要命。当我非常聪明的时候,我经常会遇到这样的情况,在如何处理这个物体的记忆方面,我的智慧是有限的 从viewDidLoad中的UIViewController子类实例化该对象,因此:Iphone 方便类进行异步web请求的内存管理,iphone,cocoa,memory-management,Iphone,Cocoa,Memory Management,受苹果LazyTables示例的启发,我刚刚为自己构建了一个名为ImageLoader的类。我真是聪明得要命。当我非常聪明的时候,我经常会遇到这样的情况,在如何处理这个物体的记忆方面,我的智慧是有限的 从viewDidLoad中的UIViewController子类实例化该对象,因此: ImageDownloader *downloader = [[ImageDownloader alloc] init]; [downloader startDownloadWithImageView:self.
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];
}
我作为NSURLConnectionLegate的委托方法是(在相关部分):
很明显,各种各样的错误检查都还没有完成,但是你可以得到它的精彩之处,对吗?我现在可以将UIImageView和NSURL传递给它,并让它异步延迟加载图像。萨维特
所以问题是。。。如何释放下载程序?我认为我无法从创建它的ViewController中自动释放它,因为我不希望NSURLConnection在运行循环结束时调用它的委托。在connectiondFinishLoading
结束时,我是否可以释放self
?我从未见过这样的事情发生,在自己的方法中释放自己感觉有点奇怪
我的另一个想法是,我可以让这成为一个单身汉,只是不担心它会一直存在,直到我们终止。但我宁愿让这个物体复活,然后干净地离开
顺便说一句,我聪明的下一步是将此功能添加为UIImageView的一个类别。调用[imageView asynchronouslyLoadImageFromURL:(NSURL*)url]
将是一种很好的方式,您可以始终将[self retain]
放在-startDownloadWithImageView:和mageurl:
方法中,并将[self release]
放在-connectiondFinishload:
方法中。很明显,它是非常规的,但这将允许您在创建它后自动释放它,而不必担心它过早被杀死。这是可行的,但您是对的,它是非常规的。我希望有一个更标准的方式来做这些事情。我在这里所做的是偏离了通常的设计模式吗?我已经编写了类似的代码,抓挠了我的头,使它成为一个单例+1对于保留/释放自动释放:我们不应该害怕使用这些方法-这就是它们的用途!要补充一点:如果Cocoa垃圾收集器认为没有任何东西引用您的对象,我不确定它在这种情况下会做出什么反应。如果你启用它,肯定会测试很多。@andih:很公平。这就是我赞同的答案@杰夫·凯利:看起来不错,但我会在发布任何东西之前(甚至是向我的经理展示)做很多调查。谢谢杰夫-这是iPhone-没有垃圾收集!
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
UIImage *image = [[UIImage alloc] initWithData:self.activeDownload];
theImageView.image = image;
[image release];
}