Предупреждение о нехватке памяти с несколькими EGOImageView
Я прошу вашей помощи с проблемой памяти в моем приложении!
У меня есть ячейка в таблице, которая содержит горизонтальный вид прокрутки с одним или несколькими EGOImageView
s. Эта ячейка всегда находится в строке 0, но мне часто приходится перезагружать эту ячейку другим изображением.
Проблема в том, что, когда я перезагружаю свою ячейку слишком много раз (30 или 40 раз), я получаю предупреждение о памяти или иногда никаких ошибок, и приложение вылетает...
Я использую мод ARC. Вот предварительный просмотр моего кода:
Сотовый код
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier animated:(BOOL)animated{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
// Initialization code
[self.contentView setFrame:CGRectMake(0, 0, 320, 240)];
self.scrollView = [[UIScrollView alloc]initWithFrame:CGRectMake(0, 0, 320, 240)];
[self.scrollView setDelegate:self];
[self.scrollView setPagingEnabled:YES];
[self.scrollView setShowsHorizontalScrollIndicator:NO];
self.scrollView.contentSize = CGSizeMake(320, 240);
pageControl = [[UIPageControl alloc]initWithFrame:CGRectMake(0, 220, 320, 20)];
[pageControl setCurrentPage:0];
[self.contentView addSubview:self.scrollView];
[self.contentView addSubview:pageControl];
isAnimated= animated;
return self;
}
- (void)configureGallery:(NSInteger)accommodationId{
counter =0;
Accommodation *item = [[[DataManager sharedManager]accommodations]objectAtIndex:accommodationId];
numberPictures = [[item photo_set]count];
if (numberPictures >1) {
[scrollView setContentSize:CGSizeMake((numberPictures + 2)*320, 240)];
} else [scrollView setContentSize:CGSizeMake(320, 240)];
[pageControl setNumberOfPages:numberPictures];
// add the last image into the first position
if (numberPictures) {
[self addImageWithName:[NSString stringWithFormat:@"%@%@",[[DataManager sharedManager]baseUrl],[[item.photo_set objectAtIndex:numberPictures-1]thumbnail_gallery]] atPosition:0];
}
// add all of the images to the scroll view
for (int i = 0; i < numberPictures; i++) {
[self addImageWithName:[NSString stringWithFormat:@"%@%@",[[DataManager sharedManager]baseUrl],[[item.photo_set objectAtIndex:i]thumbnail_gallery]] atPosition:i+1 ];
}
// add the first image into the last position
[self addImageWithName:[NSString stringWithFormat:@"%@%@",[[DataManager sharedManager]baseUrl],[[item.photo_set objectAtIndex:0]thumbnail_gallery]] atPosition:numberPictures+1];
[self.scrollView scrollRectToVisible:CGRectMake(320,0,320,416) animated:NO];
[self performSelector:@selector(switchToNextPhoto) withObject:nil afterDelay:5];
}
- (void)addImageWithName:(NSString*)imageString atPosition:(int)position {
// add image to scroll view
UIImageView * placeHolderView = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"France"]];
[placeHolderView setFrame:CGRectMake(position*320, 0, 320, 240)];
UIActivityIndicatorView * activityView = [[UIActivityIndicatorView alloc]initWithFrame:CGRectMake((position*320)+160, 120, 20, 20)];
[activityView startAnimating];
EGOImageView *imageView = [[EGOImageView alloc] init];
imageView.frame = CGRectMake(position*320, 0, 320, 240);
[self.scrollView addSubview:placeHolderView];
[self.scrollView addSubview:activityView];
[self.scrollView addSubview:imageView];
imageView.imageURL = [NSURL URLWithString:imageString];
}
Код таблицы для строки 0
GalleryDetailCell *cell = (GalleryDetailCell *) [tableView dequeueReusableCellWithIdentifier: @"GalleryAnimated"];
if (cell == nil) {
cell = [[GalleryDetailCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier: @"GalleryAnimated" animated:animated];
}
[cell configureGallery:id];
cellToReturn = cell;
Ты хоть представляешь, где моя ошибка? Должен ли я вручную обрабатывать мой EGOImageView
и положить их nil
когда я перезаряжаю свою камеру?
Спасибо за ваше время!
1 ответ
EGOImageView может привести к утечкам памяти, имейте в виду.
Прежде всего, проверьте, освобождает ли он _responseData в dealloc EGOImageLoadConnection, чтобы он выглядел следующим образом:
- (void)dealloc
{
self.response = nil;
self.delegate = nil;
[_connection release];
[_imageURL release];
[_responseData release]; //this line is absent in current EGOImageLoadConnection.m
[super dealloc];
}
Затем вызовите cancelImageLoad при освобождении представления, которое использует его, и обнуляет его атрибут изображения (помните, я использую пример кода ARC):
- (void)dealloc
{
//...
self.myView.image = nil;
[self.myView cancelImageLoad];
//...
}
И я бы также рекомендовал иногда звонить:
[EGOCache.currentCache clearCache];
В любом случае, не стесняйтесь использовать инструменты. Откройте инструмент Allocations, щелкните VM Tracker и установите автоматические снимки с задержкой в 1 секунду. Затем просмотрите столбец "Грязная память" и строку "Память тега 70", которая показывает, сколько образов памяти потребляют в вашем приложении.