Проблемы с памятью ScrollView - PullRequest
0 голосов
/ 03 апреля 2012

Я пытаюсь загрузить в scrollview 50 png изображений, и я решил сделать это путем отложенной загрузки. Но у меня все еще большие проблемы с памятью, мое приложение вылетает при прокрутке 30 страниц.

Пожалуйста, помогите мне понять, почему это происходит, мой код:

UIImage *1 = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"30" ofType:@"png"]];
....
imageArray = [NSArray arrayWithObjects:1,2,3,4, ...];

- (void)loadPage:(NSInteger)page 
{
    if (page < 0 || page >= imageArray.count) 
    {
        return;
    }

    UIView *pageView = [pageViews objectAtIndex:page];
    if ((NSNull*)pageView == [NSNull null]) 
    {

        CGRect frame = self.scrollView.bounds;
        frame.origin.x = frame.size.width * page;
        frame.origin.y = 0.0f;


        UIImageView *newPageView = [[UIImageView alloc] initWithImage:[imageArray objectAtIndex:page]];
        newPageView.contentMode = UIViewContentModeScaleAspectFit;
        newPageView.frame = frame;
        [self.scrollView addSubview:newPageView];
        [pageViews replaceObjectAtIndex:page withObject:newPageView];
    }
}


- (void)purgePage:(NSInteger)page 
{
    if (page < 0 || page >= imageArray.count) 
    {
        return;
    }

    UIView *pageView = [pageViews objectAtIndex:page];
    if ((NSNull*)pageView != [NSNull null]) 
    {
        [pageView removeFromSuperview];
        [pageViews replaceObjectAtIndex:page withObject:[NSNull null]];
    }
}


- (void)loadVisiblePages 
{
    CGFloat pageWidth = self.scrollView.frame.size.width;
    NSInteger page = (NSInteger)floor((self.scrollView.contentOffset.x * 2.0f + pageWidth) / (pageWidth * 2.0f));

    self.pageControl.currentPage = page;

    // Work out which pages you want to load
    NSInteger firstPage = page - 1;
    NSInteger lastPage = page + 1;

    // Purge anything before the first page
    for (NSInteger i=0; i<firstPage; i++) 
    {
        [self purgePage:i];
    }

    for (NSInteger i=firstPage; i<=lastPage; i++) 
    {
        [self loadPage:i];
    }

    for (NSInteger i=lastPage+1; i<imageArray.count; i++) 
    {
        [self purgePage:i];
    }

    NSString *string = [NSString stringWithFormat:@"%i.png",page+1];
    layer = [UIImage imageNamed:string];
}

Ответы [ 2 ]

0 голосов
/ 04 апреля 2012

Я нашел проблему, это создавало newPageView. Поэтому я изменил это на следующее, и мое приложение теперь не падает.

UIImageView *newPageView = [[UIImageView alloc] initWithImage:[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:string ofType:@"png"]]];

Спасибо за вашу помощь.

0 голосов
/ 03 апреля 2012

Вы должны освободить newPageView после добавления его в массив pageViews.

...