освобождать объекты в многопоточности - PullRequest
0 голосов
/ 12 октября 2011

Предположим, я создаю новый поток и передаю ему объект.Как это выпустить?

- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
    float x=    scrollView.contentOffset.x/(self.view.frame.size.width/2 + 40 );
    int pg=round(x);
    pg=abs(x);
    currentPage=pg;
    if(pg!=currentIndex && pg+1 < pageCounter)
    {
        currentIndex=   pg; 
        NSNumber *num=[NSNumber numberWithInt:pg+1];
        [NSThread detachNewThreadSelector:@selector(getImageForPage:) toTarget:self withObject:num];
    }
}

// здесь идет фоновое задание

-(void)getImageForPage:(NSNumber*)page{
    NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init];
    int pg=[page intValue];
    UIButton *btn = (UIButton*)[scrl viewWithTag:pg];
    UIImageView *imgV = (UIImageView *)[btn viewWithTag:1111];      
    if(imgV.image==nil)
    {
        NSLog(@"currnt visible page %d ",currentPage);
        if(!isWorking)
        {
        UIImage *im=    [self imageFromPDFforPage:pg+1];        
            imgV.image = im;
        }
        else
            [self performSelector:@selector(getImageForPage:) withObject:[NSNumber numberWithInt:pg+1] afterDelay:3];
    }
    [pool drain];
}

мне позвонить [сток бассейна];или [пул релиз];

- (UIImage *)imageFromPDFforPage:(int)page {
    isWorking=YES;
    CGPDFPageRef pageRef = CGPDFDocumentGetPage(pdf, page);
    CGRect pageRect = CGPDFPageGetBoxRect(pageRef, kCGPDFCropBox);  
    NSLog(@"page %d, w=  %f h= %f",page, pageRect.size.width,pageRect.size.height);
    UIGraphicsBeginImageContext(pageRect.size);
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextTranslateCTM(context, CGRectGetMinX(pageRect),CGRectGetMaxY(pageRect));
    CGContextScaleCTM(context, 1, -1);  
    CGContextTranslateCTM(context, -(pageRect.origin.x), -(pageRect.origin.y));     
    CGAffineTransform transform = aspectFit(CGPDFPageGetBoxRect(pageRef, kCGPDFCropBox),
                                            CGContextGetClipBoundingBox(context));
    CGContextConcatCTM(context, transform);
    CGContextDrawPDFPage(context, pageRef);     
    UIImage *finalImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    isWorking=NO;
    return finalImage;          
} 

Насколько я понимаю, эта функция также вызывается в фоновых потоках.Здесь pdf - переменная класса.я делаю что-то не так?

Ответы [ 2 ]

0 голосов
/ 12 октября 2011

Эй, Саураб, ты можешь позвонить [pool release] или [pool drain]. Вы можете проверить документацию здесь:

http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSAutoreleasePool_Class/Reference/Reference.html

Или проверьте этот ответ для дополнительной информации:

В чем разница между отправкой -release или -drain в пул Auto-Release?

0 голосов
/ 12 октября 2011

(1) В среде без сбора мусора [pool drain] и [pool release] ведут себя одинаково.

(2) Объект, который вы передаете в отдельном потоке, является объектом с автоматическим освобождением, поэтому выне нужно выпускать его в scrollViewDidScroll:(UIScrollView *)scrollView.

Кроме того, если вы ориентируетесь на версию iOS, которая поддерживает GCD, вы, скорее всего, захотите использовать эту технологию, а не потоки.

...