Xcode:UIScrollView图库,有内存问题

时间:2011-01-18 16:38:43

标签: iphone xcode uiscrollview

我正在尝试开发基于UIScrollView的图片库。

让我解释一下我在这里想要实现的目标:

我想要一个可以显示最多140张图像的滑动演示文稿。 (你可以来回滑动) 我在网上找到了相关信息,并且我被告知最好的方法是使用UIScrollview,其中有3 UIImageViews您可以在superview中创建和删除。

所以我设法创建了这样一个“滑动图像库”,并提供了一些教程的帮助:)。 我已经设法将应用程序上传到ipad,启动应用程序并运行它。

在我查看了大约50-70张幻灯片后,应用程序崩溃(内存不足)。我对Obj的了解。 C不是那么好。

你会找到下面的代码:它是Prob。与释放图像有关。 对代码的改进非常有用

#import "ParatelPresentationViewController.h"

//Define the UIView ( we need 3 Image Views left, mid right);
@interface SlideShowView : UIView
{
 NSArray * mImages;

 UIImageView * mLeftImageView;
 UIImageView * mCurrentImageView;
 UIImageView * mRightImageView;

 NSUInteger mCurrentImage;

 BOOL mSwiping;
 CGFloat mSwipeStart;
}

- (id)initWithImages:(NSArray *)inImages;

@end // SlideShowView

#pragma mark -

@implementation SlideShowView


- (UIImageView *)createImageView:(NSUInteger)inImageIndex
{
 if (inImageIndex >= [mImages count])
 {
  return nil;
 }

 UIImageView * result = [[UIImageView alloc] initWithImage:[mImages objectAtIndex:inImageIndex]];
 result.opaque = YES;
 result.userInteractionEnabled = NO;
 result.backgroundColor = [UIColor blackColor];
 result.contentMode = UIViewContentModeScaleAspectFit;
 result.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight ;

 return result;
}

- (id)initWithImages:(NSArray *)inImages
{
 if (self = [super initWithFrame:CGRectZero])
 {
  mImages = [inImages retain];

  NSUInteger imageCount = [inImages count];
  NSLog(@"hoeveel foto's: %i");
  if (imageCount > 0)
  {
   mCurrentImageView = [self createImageView:0];
   [self addSubview:mCurrentImageView];

   if (imageCount > 1)
   {
    mRightImageView = [self createImageView:1];
    [self addSubview:mRightImageView];
   }

  }

  self.opaque = YES;
  self.backgroundColor = [UIColor blueColor];
  self.contentMode = UIViewContentModeScaleAspectFit;
  self.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
 }

 return self;
}

- (void)dealloc
{
 [mImages release];
 [super dealloc];
}



- (void)layoutSubviews
{
 if (mSwiping)
  return;

 //CGSize contentSize = self.frame.size; // Enable when you use content.width/height
 //self.backgroundColor = [UIColor redColor];
 mLeftImageView.frame = CGRectMake(-1024, 0.0f, 1024, 748);//  (-1024, 0.0f, 1024, 748) can be replaced by  (-contentSize.width, 0.0f, contentSize.width, contentSize.height);
 mCurrentImageView.frame = CGRectMake(0.0f, 0.0f, 1024, 748);
 mRightImageView.frame = CGRectMake(1024, 0.0f,  1024, 748);
}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
 if ([touches count] != 1)
  return;

 mSwipeStart = [[touches anyObject] locationInView:self].x;
 mSwiping = YES;

 mLeftImageView.hidden = NO;
 mCurrentImageView.hidden = NO;
 mRightImageView.hidden = NO;
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
 if (! mSwiping || [touches count] != 1)
  return;

 CGFloat swipeDistance = [[touches anyObject] locationInView:self].x - mSwipeStart;

 //CGSize contentSize = self.frame.size;

 mLeftImageView.frame = CGRectMake(swipeDistance - 1024, 0.0f, 1024, 748);
 mCurrentImageView.frame = CGRectMake(swipeDistance, 0.0f, 1024, 748);
 mRightImageView.frame = CGRectMake(swipeDistance + 1024, 0.0f, 1024, 748);
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
 if (! mSwiping)
  return;

 //CGSize contentSize = self.frame.size;

 NSUInteger count = [mImages count];

 CGFloat swipeDistance = [[touches anyObject] locationInView:self].x - mSwipeStart;
 if (mCurrentImage > 0 && swipeDistance > 50.0f)
 {
  mRightImageView.image = nil;
  //[mRightImageView.image release];
  [mRightImageView removeFromSuperview];
  [mRightImageView release];
  //mRightImageView = nil;
  //NSLog(@"Count of mRight : %i",[mRightImageView retainCount]);


  mRightImageView = mCurrentImageView;
  mCurrentImageView = mLeftImageView;

  mCurrentImage--;
  if (mCurrentImage > 0)
  {
   mLeftImageView = [self createImageView:mCurrentImage - 1];
   mLeftImageView.hidden = YES;

   [self addSubview:mLeftImageView];
  }
  else
  {
   mLeftImageView = nil;
  }
 }
 else if (mCurrentImage < count - 1 && swipeDistance < -50.0f)
 {
  mLeftImageView.image = nil;
  //[mLeftImageView.image release];
  [mLeftImageView removeFromSuperview];
  [mLeftImageView release];
  //mLeftImageView = nil;

  mLeftImageView = mCurrentImageView;
  mCurrentImageView = mRightImageView;

  mCurrentImage++;
  if (mCurrentImage < count - 1)
  {
   mRightImageView = [self createImageView:mCurrentImage + 1];
   mRightImageView.hidden = YES;

   [self addSubview:mRightImageView];
   NSLog(@"Count of mRight : %i",[mRightImageView.image retainCount]);
  }
  else
  {
   mRightImageView = nil;
  }
 }

 [UIView beginAnimations:@"swipe" context:NULL];
 [UIView setAnimationCurve:UIViewAnimationCurveEaseOut];
 [UIView setAnimationDuration:0.3f];

 mLeftImageView.frame = CGRectMake(-1024, 0.0f, 1024, 748);
 mCurrentImageView.frame = CGRectMake(0.0f, 0.0f, 1024, 748);
 mRightImageView.frame = CGRectMake(1024, 0.0f, 1024, 748);

 [UIView commitAnimations];

 mSwiping = NO;
}


@end // SlideShowView


#pragma mark -


@implementation ParatelPresentationViewController

- (id)init
{
 if (self = [super initWithNibName:nil bundle:nil])
 {

  NSMutableArray *Displayimages = [[NSMutableArray alloc]init];
  int i;
  for(i=0 ; i<139 ; i++) {


   NSString *tempString = [NSString stringWithFormat:@"Dia%d", i+1];
   NSLog(@"Dia%d.jpg", i+1);
   NSString *imageFile = [[NSBundle mainBundle] pathForResource:tempString ofType:@"JPG"];
   BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:imageFile];

   if (fileExists){
    [Displayimages addObject:[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:tempString ofType:@"JPG"]]];
    NSLog(@"img");
   }else {
    break;
   }

  }


  //NSArray * images = [NSArray arrayWithObjects:[UIImage imageNamed:@"1.jpg"], [UIImage imageNamed:@"2.jpg"], [UIImage imageNamed:@"3.jpg"], [UIImage imageNamed:@"4.jpg"], [UIImage imageNamed:@"5.jpg"], nil];
  //NSLog(@"Objects Img = %@", images);
  NSLog(@"Images %@",Displayimages);
  self.view = [[[SlideShowView alloc] initWithImages:Displayimages] autorelease];
  [Displayimages release];
 }

 return self;
}

// Override to allow orientations other than the default portrait orientation.
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    //return YES;
 return UIInterfaceOrientationIsLandscape (interfaceOrientation);

}

@end

如果您能找到解决方案或提示,欢迎大家加入!

提前致谢

亲切的问候巴特!

1 个答案:

答案 0 :(得分:1)

你在createImageView中肯定有内存泄漏:你将不得不改变

return result;

return [result autorelease];

可能会有更多泄漏,但这是一个明显的泄漏。

  • 约翰内斯