简体   繁体   中英

App Crash while loading images in iPhone

I am picking image from Camera and save it in local folder.I display the saved images in scrollviewer. When i try to load more than 5 images, app crash with memory warning.

See my source code here:

  for (int Count = 0; Count < [listData count]  ; Count ++)
    {
        Photo *photo = [listData objectAtIndex: Count];

        if([FileUtils fileExistsAtPath:photo.Path fileName:photo.PhotoName])
        {

            PhotoView *photoView = [[PhotoView alloc] initWithFrame: CGRectMake(ThumbnailSizeWidth * (PhotoViewCount % THUMBNAIL_COLS) + PADDING * (PhotoViewCount % THUMBNAIL_COLS) + PADDING,
                                                                                ThumbnailSizeHeight * (PhotoViewCount / THUMBNAIL_COLS) + PADDING * (PhotoViewCount / THUMBNAIL_COLS) + PADDING + PADDING_TOP,
                                                                                ThumbnailSizeWidth,
                                                                                ThumbnailSizeHeight)];
            [photoView setDelegate:self];
            [photoView setPhoto:photo];
            [photoView setTagIndexID:OrginalCounter];   
            //NSLog(@"TagIndexID:%d",Count);
            PhotoViewCount ++ ;


            if(photo.isPrivacy)
            {
                UIImage *tImage = [UIImage imageNamed:@"locked.png"];
                [photoView setPhotoViewImage:tImage];
            }
            else
            {
                [photoView setTag:OrginalCounter];

                NSData *imgData = [NSData dataWithContentsOfFile:[NSString stringWithFormat:@"%@%@",photo.Path,photo.PhotoName]];
                UIImage *thumnail = [UIImage imageWithData:imgData];


                //UIImage *thumnail = [UIImage imageWithContentsOfFile:[NSString stringWithFormat:@"%@%@",photo.Path,photo.PhotoName]];
                //UIImage *thumnail = [[UIImage alloc] initWithContentsOfFile:[NSString stringWithFormat:@"%@%@",photo.Path,photo.PhotoName]];

                MyPhoto *photo = [[MyPhoto alloc] initWithImage:thumnail];
                [photos addObject:photo];
                [photo release];
                //[thumnail release];


                OrginalCounter++;

                [photoView performSelectorInBackground:@selector(setPhotoViewImage:) withObject:thumnail];

            }

            [scrollViewer addSubview:photoView];
            [photoView release];


        }
    }




    -(void) setPhotoViewImage:(UIImage*)image
    {
        NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];


        PrivacyPixAppDelegate *appDelegate = [PrivacyPixAppDelegate appDelegate];

        image=[appDelegate imageWithImage:image scaledToSize:CGSizeMake(75.0, 104.0)];
        //image = [image scaleAndCropToSize:CGSizeMake(69.0, 104.0) onlyIfNeeded:YES];
        //image =   [image scaleAndCropToSize:CGSizeMake(75, 100)];

        //image=[image ScaleImageToRect:image displaySize:CGSizeMake(40,40)];


        if(!btnPhoto)
            btnPhoto = [[UIImageView alloc] init];
            [btnPhoto setFrame:CGRectMake(2, 2, 75, 75)];
        //[btnPhoto setContentMode:UIViewContentModeTop];
        btnPhoto.image = image;
        [self addSubview:btnPhoto];
        //[btnPhoto release];


        if(!txtPhotoName)
            txtPhotoName = [[UITextField alloc] init];

            [txtPhotoName setDelegate:self];
        [txtPhotoName setFrame:CGRectMake(2, btnPhoto.frame.size.height + 2, self.frame.size.width, 20)];
        txtPhotoName.font = [UIFont boldSystemFontOfSize:12.0];
        txtPhotoName.backgroundColor = [UIColor whiteColor];
        txtPhotoName.textAlignment = UITextAlignmentCenter;
        txtPhotoName.borderStyle = UITextBorderStyleLine;
        txtPhotoName.text = photo.PhotoCaption;
        txtPhotoName.returnKeyType = UIReturnKeyDone;
        txtPhotoName.hidden = YES;
        [self addSubview:txtPhotoName];


        if(!lblPhotoName)
            lblPhotoName = [[UILabel alloc] init];

            [lblPhotoName setFrame:CGRectMake(0, btnPhoto.frame.size.height, self.frame.size.width, 25)];
        lblPhotoName.backgroundColor = [UIColor clearColor];
        lblPhotoName.font = [UIFont systemFontOfSize:9.0];
        lblPhotoName.userInteractionEnabled = NO;
        lblPhotoName.text = photo.PhotoCaption;
        lblPhotoName.numberOfLines = 2;
        lblPhotoName.hidden = NO;
        lblPhotoName.textAlignment =  UITextAlignmentCenter;
        [self addSubview:lblPhotoName];



        //[lblPhotoName release];

        [pool release];
    }


    -(UIImage*)imageWithImage:(UIImage*)image scaledToSize:(CGSize)newSize
    {
        // Create a bitmap context.
        UIGraphicsBeginImageContext( newSize );
        [image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];
        UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        return newImage;

    }   

If you crash with a memory warning, this must be because your images are too big. You should resize them before you display them on screen, so they take less memory space. You can do this by using the categories on this post: http://vocaro.com/trevor/blog/2009/10/12/resize-a-uiimage-the-right-way/

In my opinion, you should not load image data into memory which leads to low memory crash just keep imageName and imagePath.

for setPhotoViewImage: function just pass the imageName and imagePath instead of uiimage, and directly load image when ever you need image.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM