UIScrollView PhotoViewer получает предупреждение о памяти после 125 фотографий на iPod

Я застрял в странной проблеме, пытался найти решение из всех возможных источников, но пока не повезло.

Мое требование - это что-то похожее на приложение для просмотра фотографий на iphone, но есть еще кое-что, например, загрузка изображения, загрузка и т. Д. Технически я занимаюсь созданием основного просмотра с прокруткой, размер содержимого которого равен размеру всего выбранного изображения * ширина изображения У меня есть маленький вид изнутри, который также равен нет. изображений, выбранных из средства выбора. Представление содержит небольшое представление прокрутки и представление изображения, которое позволяет пользователю изменять масштаб изображения, масштабировать и т. д., а основное представление прокрутки имеет список жестов, который позволяет проводить пальцем. Чтобы получить доступ к изображениям, я сохраняю URL-адрес актива и получаю изображение, когда пользователь проводит пальцем влево или вправо. В любой момент времени я сохраняю только 1 изображение в памяти, т. Е. Если пользователь проводит пальцем по 2-й фотографии, я удаляю 1-ю фотографию из основного прокрутки.

Но я все еще сталкиваюсь с проблемами памяти на iPod, если я выбрал 125 фотографий и проведу несколько раз, чтобы закончить и вернуться.

Образец кода.:-

    ***//InnerScrollView is the class which contains view with scroll and imageview
    //The values of initial and final counter will always be a diffrence of 1 so it creates only one object**




  for(int j=initialCounter;j<finalCounter;j++) {


            InnerScrollView *innerScrollViewObj=[[InnerScrollView alloc] initWithFrame:CGRectMake(320*j, 0, 320, 480)
                                                                                   url:[selectedImageList objectAtIndex:j] tag:self.initialImageViewCounter];
            innerScrollViewObj.delegate=self;
            [mainScrollView addSubview:innerScrollViewObj];
            [innerScrollViewObj release];
            innerScrollViewObj=nil;
        }

**//This is main scrollview which gets created once**





     mainScrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0,0 , 320, 480)];
        mainScrollView.pagingEnabled = YES;
//        mainScrollView.delegate=self;
        mainScrollView.showsHorizontalScrollIndicator = NO;
        mainScrollView.showsVerticalScrollIndicator = NO;
        mainScrollView.maximumZoomScale = 4.0;
        mainScrollView.minimumZoomScale = 1.0;
        mainScrollView.backgroundColor=[UIColor blackColor];
        [mainScrollView setCanCancelContentTouches:NO];
        mainScrollView.clipsToBounds = YES;
        mainScrollView.scrollEnabled = FALSE;
        mainScrollView.contentSize = CGSizeMake(320*[selectedImageList count], mainScrollView.bounds.size.height);
        [self.view addSubview:mainScrollView];

//THis is the method which gets called when i swipe left and the previous images gets deleted

-(void)deleteScrollViewFormMainView:(NSNumber*)indexToDelete{

    @try{
        NSLog(@"ScrollView to be deleted %@",[[mainScrollView subviews] objectAtIndex:0]);
        [[[mainScrollView subviews] objectAtIndex:0] removeFromSuperview];

    }
    @catch (NSException *e) {
        NSLog(@"ScrollView view exception %@",[e description]);
    }
}






- (id)initWithFrame:(CGRect)frame url :(ALAsset*) imageUrl tag:(int)tag
{
    self = [super initWithFrame:frame];
    if (self) {

        self.userInteractionEnabled=YES;
//        self.tag=tag;
        UIImage *image = [UIImage imageWithCGImage:[[imageUrl defaultRepresentation] fullResolutionImage ]];
        UIImageView* imageview = [[UIImageView alloc] initWithImage:image];
        imageview.tag = VIEW_FOR_ZOOM_TAG;
        imageview.frame=CGRectMake(0, 0, self.frame.size.width, self.frame.size.height);
        imageview.backgroundColor=[UIColor clearColor];
        imageview.contentMode=UIViewContentModeScaleAspectFit;

       UIScrollView* pageScrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
        NSLog(@"Page scrollview is %@",pageScrollView);
        pageScrollView.tag=tag;
        pageScrollView.minimumZoomScale = 0.4f;
        pageScrollView.maximumZoomScale = 2.0f;
        pageScrollView.zoomScale = 1.0f;
        pageScrollView.backgroundColor=[UIColor clearColor];
        pageScrollView.delegate = self;
        pageScrollView.showsHorizontalScrollIndicator = NO;
        pageScrollView.showsVerticalScrollIndicator = NO;
        [pageScrollView setCanCancelContentTouches:NO];
        [self addSubview:pageScrollView];
        [pageScrollView addSubview:imageview];



        UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap)];
        singleTap.numberOfTapsRequired=1;
        singleTap.delegate=self;
        [self addGestureRecognizer:singleTap];
        singleTap=nil;

        UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleDoubleTap)];
        doubleTap.numberOfTapsRequired=2;
        doubleTap.delegate=self;
        [self addGestureRecognizer:doubleTap];

        singleTap=nil;
        doubleTap=nil;
        imageview=nil;
        pageScrollView=nil;

    }
    return self;
}

Должен ли я сделать InnerImageView класс как класс Singelton? Поможет ли это, потому что я думаю, что проблемы с памятью могут быть из-за создания нескольких объектов (хотя я выпускаю его должным образом).

Пожалуйста, помогите, ребята.!! Заранее спасибо.

1 ответ

Can you post the definition of InnerScrollView? The most likely problem is that your delegate свойство retain, which is keeping your innerScrollViewObj from being deallocated.

So, I assume you have something like:

@property (nonatomic, retain) id delegate;

Который должен быть:

@property (nonatomic) id delegate;

Or, if you enable ARC it should be:

@property (nonatomic, weak) id delegate;

Кроме того, имейте в виду, что [mainScrollView subviews] только держит представления, а не любые контроллеры. Поэтому, если вы освободите контроллер, он не сможет отвечать на какие-либо события или контролировать что-либо, и вы можете получить ошибки из-за отправки сообщений на освобожденные объекты.

Другие вопросы по тегам