UIImage проблема - PullRequest
       2

UIImage проблема

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

Я загружаю изображения размером 450 КБ в виде UIImage, а затем добавляю их в UIscrollview.в то время как я непрерывно прокручиваю 30 изображений, происходит сбой ... в чем может быть причина ... это проблема утечки памяти ... или проблема размера изображения ...?спасибо заранее ..

вот мой код ..

@try{

NSAutoreleasePool *pool;
pool = [[NSAutoreleasePool alloc] init];

//NSArray *array = [global_ContentString componentsSeparatedByString:@"@@#"];
    NSArray *array1 = [catalogURL componentsSeparatedByString:@"&"];
    //**NSLog(@"array1******  = %@",array1);
    NSLog(@"loading catalog image(method: loadCatalogImage).......%@%@",baseURL, [[[array1 objectAtIndex:0] componentsSeparatedByString:@"##"] objectAtIndex:0]); 

    //NSLog(@"baseURL = %@",baseURL);
    NSLog(@"loading catalog image.......%@%@",baseURL, [[[array1 objectAtIndex:0] componentsSeparatedByString:@"##"] objectAtIndex:0]); 

    zoomedImageURL = [NSString stringWithFormat:@"%@%@", baseURL, [[[array1 objectAtIndex:0] componentsSeparatedByString:@"##"] objectAtIndex:1]];

    [zoomedImageURL retain];

    NSLog(@"aaaaaaaaaaaaaa = %@",zoomedImageURL);
    //UIImage *img = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@%@",baseURL, [[[array1 objectAtIndex:0] componentsSeparatedByString:@"##"] objectAtIndex:0]]]]];
    UIImage *img = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@",zoomedImageURL]]]];

    imgView.contentMode = UIViewContentModeScaleAspectFit;
    imgView.image = img;//[GPSTripTracking generatePhotoThumbnail:img:109]; 

[pool release];

[global_imgProgress stopAnimating];

}
@catch (NSException *e) {
    [global_imgProgress stopAnimating];
    NSLog(@"Exception....");
}
@finally {

}   

выпускаю мой imgView в методе dealloc ..

я реализовал следующий код в "scrollviewdidscroll"

- (void)scrollViewDidScroll:(UIScrollView *)sender {
// We don't want a "feedback loop" between the UIPageControl and the scroll delegate in
// which a scroll event generated from the user hitting the page control triggers updates from
// the delegate method. We use a boolean to disable the delegate logic when the page control is used.
if (pageControlUsed) {
    // do nothing - the scroll was initiated from the page control, not the user dragging
    //pageText.text = [NSString stringWithFormat:@"%d/%d", (pageControl.currentPage +1), pageControl.numberOfPages];
    pageText.text = [NSString stringWithFormat:@"%d/%d", (pageControl.currentPage ), pageControl.numberOfPages];
    //NSLog(@"not scrollling page....");
    return;
}


// Switch the indicator when more than 50% of the previous/next page is visible
CGFloat pageWidth = scrollView.frame.size.width;
int page = floor((scrollView.contentOffset.x - pageWidth / 2) / pageWidth) + 1;
pageControl.currentPage = page;

// load the visible page and the page on either side of it (to avoid flashes when the user starts scrolling)
[self loadScrollViewWithPage:page - 1];
[self loadScrollViewWithPage:page];
[self loadScrollViewWithPage:page + 1];
//NSLog(@"scrolling page....%d", page);

// A possible optimization would be to unload the views+controllers which are no longer visible

}

и мой код для «loadScrollViewWithPage» равен

- (void)loadScrollViewWithPage:(int)page 

{// page -;

if (page < 0) return;
if (page >= numberOfPages) return;



if(!isViewCatalog && searchId == 1)
{
    //NSLog(@"curre page = %d",pageControl.currentPage);
    NSArray *array1 = [global_ContentString componentsSeparatedByString:@"@@#"];
    if(searchInCatalogFlag == 1)
    {
        pageControl.currentPage=0;
        NSArray *urlArray = [[array1 objectAtIndex:pageControl.currentPage] componentsSeparatedByString:@"##"];
        //NSLog(@"url array** = %@",urlArray);

        headerText.text = [NSString stringWithString:[urlArray objectAtIndex:0]];

        pageText.text = [NSString stringWithFormat:@"%d/%d",  pageControl.currentPage, (pageControl.numberOfPages - 1)];

    }
    else

    {
    NSArray *urlArray = [[array1 objectAtIndex:pageControl.currentPage] componentsSeparatedByString:@"##"];
    //NSLog(@"url array** = %@",urlArray);
    headerText.text = [NSString stringWithString:[urlArray objectAtIndex:0]];

    pageText.text = [NSString stringWithFormat:@"%d/%d",  pageControl.currentPage, (pageControl.numberOfPages - 1)];
    }
        if(page == selectedPage && ![global_imgProgress isAnimating])
        [global_imgProgress startAnimating];
}
else
{
    headerText.text = [NSString stringWithString:global_SelectedCatalogName];
    pageText.text = [NSString stringWithFormat:@"%d/%d",  (pageControl.currentPage + 1), (pageControl.numberOfPages - 1)];
    if(page == selectedPage + 1 && ![global_imgProgress isAnimating] )
        [global_imgProgress startAnimating];
//  NSLog(@"header text = %@", headerText.text);    
    //headerText.text = [NSString stringWithString:[urlArray objectAtIndex:0]];
}


FullPageView *controller = [viewControllers objectAtIndex:page];
if ((NSNull *)controller == [NSNull null] ) {

    //NSLog(@"Loading page =========== %d, %d", page, selectedPage);
    //voucherPageNo = page;
    //[voucherImage retain];
    if(universalApp==2)
    {
    controller = [[FullPageView alloc] initWithNibName:@"FullPageView_iphone" bundle:nil];//:page];
    [controller.view setFrame:CGRectMake(0, 0, 320,332)];
    }
    else
    {
    controller = [[FullPageView alloc] initWithNibName:@"FullPageView" bundle:nil];//:page];
    [controller.view setFrame:CGRectMake(0, 192, 768, 691)];
    }
    //[controller.view setFrame:CGRectMake(0, 0, 320,480)];
    //[controller.view setFrame:CGRectMake(0, 192, 768, 691)];
    if((!isViewCatalog && searchId < 2 && searchInCatalogFlag == 0))// || searchInCatalogFlag == 1)
    {
    //  NSLog(@">>>>>>>>>>>>>>>>>> LOADING IMAGE >>>>>>>>>>>>>>>>>>>>");
        [controller setPageNo:page];
    //  if(page >= selectedPage - 1)
            [NSThread detachNewThreadSelector:@selector(loadImage) toTarget:controller withObject:nil]; 

    }
    else //if((page >= (selectedPage - 1) && page <= (selectedPage + 1)) || !isFirstTimeLoading)
    {
        NSLog(@"Loading CATALOG IMAGE = %d, %d, %@", page, selectedPage, (isFirstTimeLoading ?@"YES" : @"NO"));
        [controller setCatalogURL:[NSString stringWithFormat:@"%@", [catalogArray objectAtIndex:page+(searchId< 2 && !isViewCatalog && searchInCatalogFlag == 0?0:1)]]];
        NSLog(@"loading image ipad= %@", [catalogArray objectAtIndex:page+(searchId< 2 && !isViewCatalog && searchInCatalogFlag == 0?0:1)]);
        //  if(page >= selectedPage - 1)
            [NSThread detachNewThreadSelector:@selector(loadCatalogImage) toTarget:controller withObject:nil];  
    //  if(page == (selectedPage + 1))
            //isFirstTimeLoading = NO;

    }
    [viewControllers replaceObjectAtIndex:page withObject:controller];
     [controller release];


        }


// add the controller's view to the scroll view
if (nil == controller.view.superview) 
{

//  NSLog(@"Voucher view addead at page..... %d", page);
    CGRect frame = scrollView.frame;
    frame.origin.x = frame.size.width * page;
    frame.origin.y = 0;
    controller.view.frame = frame;
//  NSLog(@">>>>>>>>> %f, %f", frame.size.width, frame.origin.x);

    [scrollView addSubview:controller.view];

}
//if(page == pageControl.currentPage)
    //[imgProgress startAnimating]; 


//else

//pageControlUsed = YES;

}где будет проблема ..?

Ответы [ 3 ]

2 голосов
/ 18 февраля 2011

450 КБ - размер сжатого изображения. Когда изображение загружается в память, оно распаковывается.

Практическое правило для определения того, сколько памяти займет несжатое изображение:

width * height * 4

С 30 изображениями очень вероятно, что вам не хватает памяти.

Вы должны написать свой код, чтобы хранить изображения в памяти, только если они видны на экране.

1 голос
/ 18 февраля 2011

Весьма вероятно, что ваша программа будет остановлена ​​iOS, потому что она потребляет слишком много памяти.Запустите его из XCode и посмотрите на консоль - он, вероятно, напечатает, что он получает предупреждения о памяти.

Вам придется загружать изображения по требованию, то есть только тогда, когда пользователь приблизится к ним, и выдолжны выпустить те, которые снова исчезают из поля зрения.Для этого реализуйте метод делегата

- (void)scrollViewDidScroll:(UIScrollView *)scrollView

, посмотрите на смещение содержимого представления прокрутки и загрузите / отпустите соответствующие изображения.В качестве альтернативы, вы можете не выпускать их там, а вместо этого подождать, пока не появится предупреждение памяти.Для этого реализуйте метод

- (void)didReceiveMemoryWarning

в вашем контроллере представления.

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

Это может быть проблема утечек памяти.

Попробуйте заменить эту строку

 UIImage *img = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL      URLWithString:[NSString stringWithFormat:@"%@",zoomedImageURL]]]]

и используйте это

    UIImage *img = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@",zoomedImageURL]]]];


    <<<<<YOUR CODE>>>>

    [img release];

Надеюсь, это поможет

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