2010-05-10 41 views
1

我想滚动通过用户在线相册下载的图像(如在Facebook的iPhone应用程序),因为我无法加载所有图像到内存中,一次加载3个(上一个,目前&下一个)。然后从uiscroller子视图中删除图像(prev-1)&图像(下一个+1)。 我的逻辑正常工作在模拟器,但与此错误的设备出现故障: [CALayer的保留]:发送到释放实例 消息可能是什么问题,下面 是我的代码示例我如何滚动通过IPhone中的UIScrollView 100张照片

- (void)scrollViewDidEndDecelerating:(UIScrollView *)_scrollView 
{ 
    pageControlIsChangingPage = NO; 
    CGFloat pageWidth = _scrollView.frame.size.width; 
    int page = floor((_scrollView.contentOffset.x - pageWidth/2)/pageWidth) + 1; 

    if (page>1 && page<=(pageControl.numberOfPages-3)) { 
     [self removeThisView:(page-2)]; 
     [self removeThisView:(page+2)]; 
    } 

    if (page>0) { 
     NSLog(@"<< PREVIOUS"); 
     [self showPhoto:(page-1)]; 
    } 

    [self showPhoto:page]; 
    if (page<(pageControl.numberOfPages-1)) { 
     //NSLog(@"NEXT >>"); 
     [self showPhoto:page+1]; 
     NSLog(@"FINISHED LOADING NEXT >>"); 
    } 
} 

-(void) showPhoto:(NSInteger)index 
{ 
    CGFloat cx = scrollView.frame.size.width*index; 
    CGFloat cy = 40; 

    CGRect rect=CGRectMake(0, 0,320, 480); 
    rect.origin.x = cx; 
    rect.origin.y = cy; 
    AsyncImageView* asyncImage = [[AsyncImageView alloc] initWithFrame:rect]; 
    asyncImage.tag = 999; 
    NSURL *url = [NSURL URLWithString:[pics objectAtIndex:index]]; 

    [asyncImage loadImageFromURL:url place:CGRectMake(150, 190, 30, 30) member:memberid isSlide:@"Yes" picId:[picsIds objectAtIndex:index]]; 

    [scrollView addSubview:asyncImage]; 
    [asyncImage release]; 
} 

- (void) removeThisView:(NSInteger)index 
{ 
    if (index<[[scrollView subviews] count] && [[scrollView subviews] objectAtIndex:index]!=nil) { 
     if ([[[scrollView subviews] objectAtIndex:index] isKindOfClass:[AsyncImageView class]] || [[[scrollView subviews] objectAtIndex:index] isKindOfClass:[UIImageView class]]) { 
      [[[scrollView subviews] objectAtIndex:index] removeFromSuperview]; 
     } 
    } 
} 

为了记录它在模拟器中工作正常,但不是iPhone设备本身。 任何想法将不胜感激。 欢呼声, 弗雷德。

回答

0

我猜你的AsyncImageView类使用异步连接来加载图像(这是一件好事),所以这意味着当你将它添加为滚动视图的子视图时,它可能在图像加载之前是“removedFromSuperview”完全。检查你的类的实现,如果委托在被释放时被正确地清零,并且任何连接都被取消等等。

注意类不应该保留它的委托,“分配”类属性对于这些情况是完美的。


一些提示:

  1. 而是分配/ init'ing和release'ing这么多的情况下,在滚动的,尽量保留三个高德在你的班级,只是改变了“帧”滚动时实例的属性。如果用户快速滚动,您将避免大量分配和释放,这对iPhone来说是件好事。
  2. 避免像你的代码那样直接访问ivar;使用属性,除了简单的“正确性”之外,它们还有许多优点(KVO就是其中之一)。
相关问题