最佳实践,即发即弃的异步类?

时间:2011-04-10 15:37:26

标签: iphone objective-c ios asynchronous

我有一个类,其唯一目的是从网上下载特定文件,在本地存储,然后返回存储文件的本地路径。

我根据是否有相关文件的本地副本来使用此类,如果需要下载多个文件,我有时会同时多次调用它。我使用它的方式就是

Loader *l = [[Loader alloc] initWithDelegate:self];
[l downloadFile:someFile];
[l release];

问题是,为了在下载之前保持它,我实际上在课堂上[self retain];,然后[self autorelease];完成。{I}但这感觉很酷。人们如何处理这个问题?

2 个答案:

答案 0 :(得分:1)

我同意[self release][self autorelease]感到奇怪,但这并不意味着他们错误。在某些情况下,它们可能是正确的使用方式(之前我已经使用过它们)。

但是,如果你想避免使用它们,你可以考虑创建一个只拥有LoaderManager个对象的Loader类,直到它们完成加载。它本质上是一个数组的包装器,你可以像这样(或者其他)使用它:

@interface LoaderManager : NSObject {
  NSMutableSet *loaders;
}
@end
@implementation LoaderManager
- (id)init {
  self = [super init];
  if (self) {
    loaders = [[NSMutableSet alloc] init];
  }
  return self;
}
- (void)dealloc {
  [loaders release];
  [super dealloc];
}
- (void)addLoader:(Loader *)loader {
  [loaders addObject:loader];
}
@end

然后你的Loader对象会这样做:

[myLoader downloadFile:someFile manager:aLoaderManager];

内部只会调用:

[aLoaderManager addLoader:self];

答案 1 :(得分:1)

在这种情况下,我认为您的Loader保留并自行释放本身是好的。最方便的解决方案可能是在代码中添加一个详细的注释,以解释它为什么会这样做。最大的问题是Loader需要一名代表。委托人通常不会保留他们的代表以避免保留周期,但在这种情况下,似乎可以在Loader完成下载文件之前释放委托。如果发生这种情况,可能会发生崩溃。因此,如果您想继续使用这种即发即弃的样式,您可能希望让Loader保留其委托。

相关问题