我有一个类,其唯一目的是从网上下载特定文件,在本地存储,然后返回存储文件的本地路径。
我根据是否有相关文件的本地副本来使用此类,如果需要下载多个文件,我有时会同时多次调用它。我使用它的方式就是
Loader *l = [[Loader alloc] initWithDelegate:self];
[l downloadFile:someFile];
[l release];
问题是,为了在下载之前保持它,我实际上在课堂上[self retain];
,然后[self autorelease];
完成。{I}但这感觉很酷。人们如何处理这个问题?
答案 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保留其委托。