UIImage imageWithData

时间:2010-11-20 20:38:59

标签: iphone uiimage memory-management

我有一个UITable,当我点击一行时,我会加载一组图像。 我用

创建图像
UIImage *image = [UIImage imageWithData:data];

问题在于,无论何时我点击同一行,图像都会重新分配到内存中,就像没有使用缓存并且没有内存被释放一样,因此分配的内存不断增加。 (我在设备和模拟器上使用Inspector看到了这一点)

我正在释放一切,而且,有了铿锵声,一切看起来都很好。 关键是我的应用程序崩溃了一段时间后。

有任何建议或想法吗?

编辑:

以下是我认为产生问题的代码部分:

UIView *main = [[[UIView alloc] initWithFrame:rectScrollView] autorelease];

    for (int i=0; i<[contentArray count]; i++) {
        float targetWidth = rectScrollView.size.width;
        float targetHeight = rectScrollView.size.height;

        Link *tmp_link = [contentArray objectAtIndex:i];
        AsyncImageView* asyncImage = nil;
        if(tmp_link!=nil){
            CGRect imageFrame = CGRectMake(targetWidth*i, 0, targetWidth, targetHeight); 
            //asyncImage = [[[AsyncImageView alloc] initWithFrame:imageFrame ] autorelease];
            asyncImage = [[AsyncImageView alloc] initWithFrame:imageFrame ];
            asyncImage.contentMode = UIViewContentModeScaleAspectFit;
            NSURL* url = [NSURL URLWithString:[[IMG_SERVER_URL stringByAppendingString: tmp_link.url] stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding]];
            [asyncImage loadImageFromURL:url];
            [self.scrollView addSubview:(UIImageView *)asyncImage];
            [asyncImage release];
        }

        if ([tmp_link.caption length] > 0 && asyncImage!=nil) {
            float marginTop = 25;

            UILabel *caption = [[UILabel alloc] init];
            caption.text = tmp_link.caption;
            caption.textAlignment = UITextAlignmentCenter;
            caption.textColor = [UIColor whiteColor];
            caption.font = [UIFont systemFontOfSize:12];
            caption.backgroundColor = [UIColor colorWithWhite:0.0 alpha:0.4];

            CGRect captionFrame = CGRectMake((i * targetWidth), marginTop+10, targetWidth, 20.0f);
            caption.frame = captionFrame;   
            [self.scrollView addSubview:caption];
            [caption release];
        }
        //[asyncImage release];
    }
    [main addSubview:scrollView];
    [scrollView release];
    if (pageControlEnabledTop) {
        rectPageControl = CGRectMake(0, 5, scrollWidth, 15);
    }
    else if (pageControlEnabledBottom) {
        //rectPageControl = CGRectMake(0, (scrollHeight - 25), scrollWidth, 15);
        rectPageControl = CGRectMake(0, (scrollHeight), scrollWidth, 15);
    }
    if (pageControlEnabledTop || pageControlEnabledBottom) {
        //pageControl = [[[UIPageControl alloc] initWithFrame:rectPageControl] autorelease];
        pageControl = [[UIPageControl alloc] initWithFrame:rectPageControl];
        pageControl.numberOfPages = [contentArray count];
        pageControl.currentPage = page;
        [main addSubview:pageControl];
        [pageControl release];
    }
    if (pageControlEnabledTop || pageControlEnabledBottom || rememberPosition) self.scrollView.delegate = self;
    //if (margin) [margin release];
    return (UIScrollView *)main;

它的用法如下:

reviewImagesImage = [[IGUIScrollViewImage alloc] init];
        if([currentReview.linkScreenshots count]>0){

            //reviewImages
            reviewImages = [[UIView alloc] init];

            //placing the images
            CGRect frameImages = reviewImages.frame;
            frameImages.origin.x = 10;
            frameImages.origin.y = (infoView.frame.origin.y + infoView.frame.size.height + 10.0f);
            frameImages.size.width = 300;
            frameImages.size.height = 350.0f;
            reviewImages.frame = frameImages;
            reviewImages.backgroundColor =  [UIColor clearColor];
            [reviewImagesImage setContentArray:currentReview.linkScreenshots];
            [reviewImagesImage setWidth:reviewImages.frame.size.width andHeight: reviewImages.frame.size.height];
            [reviewImagesImage enablePageControlOnBottom];
            [reviewImagesImage setBackGroudColor: [UIColor clearColor]];
            UIScrollView *tmp_sv = [reviewImagesImage getWithPosition:0];
            [reviewImages addSubview:tmp_sv];
            [self.view addSubview:reviewImages];
                    [reviewImages release];
        }

我注意到如果我尝试发布reviewImagesImage我的应用崩溃了:/

2 个答案:

答案 0 :(得分:1)

当然没有使用缓存,因为每次都会从数据中创建新的UIImage。如果内存使用量显着增加,就像你说的那样,很可能是我们的错,无意中将引用保留在某处。

答案 1 :(得分:0)

image设置为imageWithData后,将image保存到应用包中的filepath