Вдохновленный примером Apple LazyTables, я только что создал себе класс с именем ImageLoader. Это мучительно умно с моей стороны. И, как это часто бывает, когда я мучительно умен, я сталкиваюсь с ограничениями моей мудрости относительно того, как обращаться с памятью об этом объекте.
Объект создается из подкласса UIViewController внутри viewDidLoad, таким образом:
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 и позволить ей лениво загружать изображение асинхронно. Sa-Weet!
Так вот в чем вопрос ... Как мне выпустить downloader
? Я не думаю, что смогу autorelease
из ViewController, где я его создаю, потому что я не ожидаю, что NSURLConnection вызовет свой делегат к концу цикла выполнения. Могу ли я выпустить self
в конце connectionDidFinishLoading
? Я никогда не видел, чтобы это было сделано, чувствую себя немного странно, выпуская себя из своего метода.
Моя другая мысль заключается в том, что я мог бы сделать это синглтоном, и просто не беспокоиться о том, что он торчит, пока мы не закончим. Но я бы предпочел, чтобы объект ожил и ушел чисто.
Кстати, следующим шагом моего ума будет добавление этой функциональности в качестве категории UIImageView. Было бы неплохо позвонить [imageView asynchronouslyLoadImageFromURL:(NSURL *)url]
.