objective-c – 停止绘制CATiledLayer

是否可以停止CATiledLayer绘制(drawLayer:inContext)?
它异步绘制,当我尝试释放CATiledLayer使用的CGPDFDocumentRef时,应用程序崩溃(EXC_BAD_ACCESS).

这是我的看法

@implementation TiledPDFView

- (id)initWithFrame:(CGRect)frame andScale:(CGFloat)scale{
    if ((self = [super initWithFrame:frame])) {

        CATiledLayer *tiledLayer = (CATiledLayer *)[self layer];
        tiledLayer.levelsOfDetail = 4;
        tiledLayer.levelsOfDetailBias = 4;
        tiledLayer.tileSize = CGSizeMake(512.0,512.0);
        myScale = scale;
    }
    return self;
}

// Set the layer's class to be CATiledLayer.
+ (Class)layerClass {
    return [CATiledLayer class];
}

- (void)stopDrawing{
    CATiledLayer *tiledLayer = (CATiledLayer *)[self layer];
    [tiledLayer removeFromSuperlayer];
    tiledLayer.delegate = nil;
}
// Set the CGpdfpageRef for the view.
- (void)setPage:(CGpdfpageRef)newPage
{
    CGpdfpageRelease(self->pdfpage);
    self->pdfpage = CGpdfpageRetain(newPage);

    //self->pdfpage = newPage;
}


-(void)drawRect:(CGRect)r
{
}


// Draw the CGpdfpageRef into the layer at the correct scale.
-(void)drawLayer:(CALayer*)layer inContext:(CGContextRef)context
{   

    // First fill the background with white.
    CGContextSetRGBFillColor(context,1.0,1.0);
    CGContextFillRect(context,self.bounds);

    CGContextSaveGState(context);
    // Flip the context so that the PDF page is rendered
    // right side up.
    CGContextTranslateCTM(context,0.0,self.bounds.size.height);
    CGContextScaleCTM(context,-1.0);

    // Scale the context so that the PDF page is rendered 
    // at the correct size for the zoom level.
    CGContextScaleCTM(context,myScale,myScale);    
    CGContextDrawpdfpage(context,pdfpage);
    CGContextRestoreGState(context);

}

// Clean up.
- (void)dealloc {
    CGpdfpageRelease(pdfpage);

    [super dealloc];
}

这是我试图在视图控制器中停止和发布PDF的地方:
v是TiledPDFView的实例

-(void) stopDwaring {
     [v stopDrawing];
     [v removeFromSuperview];
     [v release];
     [self.view removeFromSuperview];
     self.view = nil;
     CGPDFDocumentRelease(pdf);

 }

解决方法

这篇文章帮助我解决了我自己的麻烦与CATiledLayer.我以Apple的文档中的TiledPDFview.m为例.
由于我需要在某个时候重绘整个视图和所有的图块,所以我使用CATiledLayer作为属性.
退出并取消分配视图控制器时,它使用[CATiledLayer retain]:发送到释放的实例的消息崩溃.
这是我的dealloc方法的视图控制器:
- (void)dealloc {
    self.tiledLayer.contents=nil;
    self.tiledLayer.delegate=nil;
    [self.tiledLayer removeFromSuperlayer];

    // note: releasing the layer still crashes- 
    // I guess removeFromSuperlayer releases it already,// but Couldn't find documentation so far.
    // So that's why it's commented out:
    // [self.tiledLayer release],self.tiledLayer=nil;

    //release the other viewcontroller stuff... 
    [super dealloc];
}

这对我行得通.希望它有助于某人.

相关文章

对象的传值与返回说起函数,就不免要谈谈函数的参数和返回值...
从实现装饰者模式中思考C++指针和引用的选择最近在看...
关于vtordisp知多少?我相信不少人看到这篇文章,多半是来自...
那些陌生的C++关键字学过程序语言的人相信对关键字并...
命令行下的树形打印最近在处理代码分析问题时,需要将代码的...
虚函数与虚继承寻踪封装、继承、多态是面向对象语言的三大特...