Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 方便类进行异步web请求的内存管理_Iphone_Cocoa_Memory Management - Fatal编程技术网

Iphone 方便类进行异步web请求的内存管理

Iphone 方便类进行异步web请求的内存管理,iphone,cocoa,memory-management,Iphone,Cocoa,Memory Management,受苹果LazyTables示例的启发,我刚刚为自己构建了一个名为ImageLoader的类。我真是聪明得要命。当我非常聪明的时候,我经常会遇到这样的情况,在如何处理这个物体的记忆方面,我的智慧是有限的 从viewDidLoad中的UIViewController子类实例化该对象,因此: ImageDownloader *downloader = [[ImageDownloader alloc] init]; [downloader startDownloadWithImageView:self.

受苹果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];
}
我作为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];
}