0

我想加载到scrollview 50 PNG图像,我选择通过延迟加载来做到这一点。但是我仍然有很大的内存问题,当我滚动30页时,我的应用程序崩溃。ScrollView内存问题

请帮助我了解为什么会出现这种情况,我的代码是:

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]; 
} 
+0

in puragePage :, set pageView = nil将其替换为NSNull实例后。看看这是否给你一个更好的性能结果。 – jmstone617 2012-04-03 22:52:34

回答

0

我发现这个问题,它正在创建newPageView。所以我改变了以下,我的应用程序现在不会崩溃。

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

谢谢你的帮助。

0

你应该将它添加到阵列浏览量释放后newPageView。

+0

我有ARC启用,所以我不能手动释放。 – Macaret 2012-04-03 09:32:03