Управление памятью для удобства класса для выполнения асинхронных веб-запросов - PullRequest
2 голосов
/ 21 мая 2010

Вдохновленный примером 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].

1 Ответ

2 голосов
/ 21 мая 2010

Вы всегда можете указать [self retain] в методе -startDownloadWithImageView:andImageURL: и [self release] в методе -connectionDidFinishLoading:.Это, конечно, нетрадиционно, но это позволит вам автоматически выпустить его после создания, не беспокоясь о его преждевременной гибели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...