objective-c - 停止绘制 CATiledLayer

标签 objective-c memory-management core-animation core-graphics

是否可以停止 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,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, -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];
}

这是我尝试在 View Controller 中停止和释放 PDF 的地方: vTiledPDFView

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

 }

最佳答案

这篇文章帮助我解决了自己在 CATiledLayer 方面的问题。我使用 Apple 文档中的 TiledPDFview.m 作为示例。 因为我需要在某个时候重绘整个 View 和所有图 block ,所以我使用 CATiledLayer 作为属性。 退出并解除分配 View Controller 时,它因 [CATiledLayer retain] 崩溃:消息已发送到已解除分配的实例。 这是我的 View Controller 的 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];
}

这对我有用。希望对某人有所帮助。

关于objective-c - 停止绘制 CATiledLayer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3871524/

相关文章:

objective-c - NSUserDefaults。 setValue 有效,而不是 setBool

objective-c - 通用首选项 Pane 被迫在 32 位上启动

java - 当内存占用超过一定阈值时强制进行全面垃圾回收

iphone - 动画期间 UIView 缩放

macos - 带旋转的图层支持 View 上的核心动画

ios - Swift 应用程序中的静态库集成 : RSA SecurID SDK for iOS

ios - 试图管理大型 UITableView 数据结构

objective-c - 这个 objective-c 代码会导致内存泄漏吗?

c++ - 在 C++ 中避免内存泄漏的一般准则

ios - 如何在 CABasicAnimation 之后使 UI 对象响应