UIImage imageWithData - PullRequest
       9

UIImage imageWithData

0 голосов
/ 20 ноября 2010

У меня есть UITable, и когда я нажимаю на строку, я загружаю набор изображений.Я создаю образы с

UIImage *image = [UIImage imageWithData:data];

Проблема в том, что когда я нажимаю на одну и ту же строку, изображения перераспределяются в память, как если бы кеш не использовался, а память не освобождалась, поэтомувыделенная память продолжает увеличиваться.(Я вижу это с помощью Инспектора как на устройстве, так и на эмуляторе)

Я выпускаю все, а также, с помощью clang, все выглядит хорошо.Дело в том, что через некоторое время мое приложение падает.

Любое предложение или идея?

РЕДАКТИРОВАТЬ:

Вот часть кода, я думаю, вызывает проблему:

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 ]

1 голос
/ 21 ноября 2010

Конечно, кеш не используется, потому что каждый раз из данных будет создаваться новый UIImage.Если использование памяти значительно возросло, как вы сказали, скорее всего, это наша вина, что непреднамеренно сохранить ссылку где-то еще.

0 голосов
/ 10 февраля 2011

После того, как вы установили image с помощью imageWithData, сохраните image в filepath в комплекте приложений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...