Iphone 使用navigationcontroller和包含子CALayer的视图时内存问题/溢出

Iphone 使用navigationcontroller和包含子CALayer的视图时内存问题/溢出,iphone,cocoa-touch,memory-management,uinavigationcontroller,release-management,Iphone,Cocoa Touch,Memory Management,Uinavigationcontroller,Release Management,我在周末没能解决这个问题。。。我原以为对Objective-C内存管理有很好的了解,但这一点很难解决 总结一下上下文:我在navigationcontroller中推送了一个类化的UIViewController。此UIViewController包含一个UIScrollView(在IB中创建)。在UIViewController viewDidLoad()函数中,我添加了一个背景PDF(在UIview层的CATiledLayer子层中) 问题是,当我从导航控制器弹出UIViewControll

我在周末没能解决这个问题。。。我原以为对Objective-C内存管理有很好的了解,但这一点很难解决

总结一下上下文:我在navigationcontroller中推送了一个类化的UIViewController。此UIViewController包含一个UIScrollView(在IB中创建)。在UIViewController viewDidLoad()函数中,我添加了一个背景PDF(在UIview层的CATiledLayer子层中)

问题是,当我从导航控制器弹出UIViewController时,应用程序崩溃

使用Zombies instruments和NSZombieLevel表明,这是因为UIViewController过度释放了

以下是UIViewController:

@interface PlanViewController : UIViewController <UIScrollViewDelegate> {
    UIScrollView *panelScrollView;
    UIView *myContentView;
    CGPDFDocumentRef myDocumentRef;
    CGPDFPageRef myPageRef;
}

@property (nonatomic, retain) IBOutlet UIScrollView *panelScrollView;
@property (nonatomic, retain) UIView *myContentView;

@end

@implementation PlanViewController
@synthesize panelScrollView;
@synthesize myContentView;

- (void)viewDidLoad {
    [self setTitle:@"Plan"];

    myDocumentRef = CGPDFDocumentCreateWithURL((CFURLRef)[[NSBundle mainBundle] URLForResource:@"salonMap" withExtension:@"pdf"]);
    myPageRef = CGPDFDocumentGetPage(myDocumentRef, 1);
    CGRect pageRect = CGRectIntegral(CGPDFPageGetBoxRect(myPageRef, kCGPDFCropBox));

    CATiledLayer *tiledLayer = [[CATiledLayer alloc] init];
    [tiledLayer setDelegate:self];
    [tiledLayer setTileSize:CGSizeMake(1024.0, 1024.0)];
    [tiledLayer setLevelsOfDetail:4];
    [tiledLayer setLevelsOfDetailBias:8];
    [tiledLayer setFrame:pageRect];

    UIView *newView = [[UIView alloc] initWithFrame:pageRect];
    [newView.layer addSublayer:tiledLayer];
    [newView setTag:555];
    [self setMyContentView:newView];
    [newView release];
    [tiledLayer release];

    [panelScrollView setDelegate:self];
    [panelScrollView setContentSize:pageRect.size];
    [panelScrollView setMaximumZoomScale:5];
    [panelScrollView addSubview:myContentView];
    [panelScrollView setClipsToBounds: YES];
    [panelScrollView setMaximumZoomScale:20.0];
    [panelScrollView setMinimumZoomScale:1.0];
    [panelScrollView setZoomScale:1];

    [self initPinsOnMap];
}

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx
{
    CGContextSetRGBFillColor(ctx, 1.0, 1.0, 1.0, 1.0);
    CGContextFillRect(ctx, CGContextGetClipBoundingBox(ctx));
    CGContextTranslateCTM(ctx, 0.0, layer.bounds.size.height);
    CGContextScaleCTM(ctx, 1.0, -1.0);
    CGContextConcatCTM(ctx, CGPDFPageGetDrawingTransform(myPageRef, kCGPDFCropBox, layer.bounds, 0, true));
    CGContextDrawPDFPage(ctx, myPageRef);
}

- (void)dealloc {
    [panelScrollView release];
    [myContentView release];
    CGPDFDocumentRelease(myDocumentRef), myDocumentRef = NULL;
    myPageRef = NULL;
    [super dealloc];
}

@end
我想知道我做错了什么。我一定会遵守《内存管理指南》。我认为这个问题来自卡莱尔。我尝试在CALayer中使用和不使用pdf,但它没有任何改变

但无论我如何编码,它总是导致: **-[PlanViewController isKindOfClass:]:消息发送到解除分配的实例0xc641750**

文书僵尸向我展示了一种超越:

88 PlanViewController僵尸-1 690954120 0x64a6a00 UIKit-[UIView(层次结构)\u makeSubtreePerformSelector:withObject:withObject:copySublayers:]

你有什么提示吗


非常感谢您的帮助

解决了问题!!!也许这会有帮助:

实际上,异步重绘由CATiledLayer调用。当释放UIViewController时,您必须对CATiledLayer说,它的委托不再处于活动状态。我向CATiledLayer添加了一个引用(分配),并在我的dealloc函数中执行以下操作:

self.PDFTiledLayer.contents=nil;
self.PDFTiledLayer.delegate=nil;
[self.PDFTiledLayer removeFromSuperlayer];

我希望你不会失去我失去的那么多时间…

解决了!!!self.PDFTiledLayer.contents=nil;self.PDFTiledLayer.delegate=nil;[self.PDFTiledLayer从SuperLayer移除];嘿-不要用答案编辑你的问题-在下面的框中实际回答;)来到法国巴黎:)我今天也有同样的问题。我独立地解决了这个问题,但后来我去寻找一些现有的答案,并找到了你的答案。人员:取消代理设置非常重要!这是一个非弧弱参考。
self.PDFTiledLayer.contents=nil;
self.PDFTiledLayer.delegate=nil;
[self.PDFTiledLayer removeFromSuperlayer];