繁体   English   中英

在 iPhone 中加载图像时应用程序崩溃

[英]App Crash while loading images in iPhone

我从相机中挑选图像并将其保存在本地文件夹中。我在滚动查看器中显示保存的图像。 当我尝试加载超过 5 张图像时,应用程序崩溃并出现 memory 警告。

在这里查看我的源代码:

  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;

    }   

如果您因 memory 警告而崩溃,这一定是因为您的图像太大。 您应该在屏幕上显示它们之前调整它们的大小,这样它们占用的 memory 空间就会更少。 您可以通过使用这篇文章中的类别来做到这一点: http://vocaro.com/trevor/blog/2009/10/12/resize-a-uiimage-the-right-way/

在我看来,您不应该将图像数据加载到 memory 中,这会导致低 memory 崩溃,只需保留 imageName 和 imagePath。

对于 setPhotoViewImage: function 只需传递 imageName 和 imagePath 而不是 uiimage,并在需要图像时直接加载图像。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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