【问题标题】:ScrollView memory problemsScrollView 内存问题
【发布时间】:2012-04-03 08:47:41
【问题描述】:

我正在尝试将 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];
}

【问题讨论】:

  • 在 pragePage: 中,将 pageView = nil 替换为 NSNull 实例后设置。看看这是否会给您带来更好的性能结果。

标签: memory uiimageview warnings scrollview automatic-ref-counting


【解决方案1】:

newPageView 添加到 pageViews 数组后应该释放它。

【讨论】:

    【解决方案2】:

    我发现了问题,它正在创建 newPageView。所以我将其更改为以下内容,我的应用程序现在不会崩溃。

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

    感谢您的帮助。

    【讨论】:

      猜你喜欢
      • 2012-04-28
      • 1970-01-01
      • 2022-12-12
      • 1970-01-01
      • 1970-01-01
      • 2011-02-12
      • 2013-07-04
      • 1970-01-01
      • 2016-12-22
      相关资源
      最近更新 更多