gpt4 book ai didi

iphone - 导航 Controller 和包含子 CALayer 的 View 出现内存问题/过度释放

转载 作者:行者123 更新时间:2023-12-03 19:12:13 24 4
gpt4 key购买 nike

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

总结上下文:我有一个子类 UIViewController,我将其插入导航 Controller 中。这个UIViewController包含一个UIScrollView(在IB中创建)。在 UIViewController viewDidLoad() 函数中,我添加了一个背景 PDF(在 UIview 层的 CATiledLayer 子层中)。

问题是,当我从导航 Controller 中弹出 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

在玩了几个小时后,我发现只有当我“[newView.layer addSublayer:tiledLayer];”时才会出现过度释放的问题。如果没有添加subLayer,则UIViewController不会过度释放。

我像这样推送我的 ViewController :

PlanViewController *trailsController = [[PlanViewController alloc] initWithNibName:@"PlanView" bundle:nil ];
[self.navigationController pushViewController:trailsController animated:YES];
[trailsController release];

我想知道我做错了什么。我确信尊重内存管理指南。我认为问题来自 CALayer。我尝试过在 CALayer 中使用或不使用 pdf,但它没有任何改变......

但无论我如何编码,它总是会导致:** -[PlanViewController isKindOfClass:]:发送到已释放实例 0xc641750 的消息**

乐器僵尸向我展示了过度释放:

88 PlanViewController Zombie -1 6909541120 0x64a6a00 0 UIKit -[UIView(Hierarchy) _makeSubtreePerformSelector:withObject:withObject:copySublayers:]

你有什么提示吗?

非常感谢您的帮助

最佳答案

解决了!!!也许它会有所帮助:

事实上,异步重绘是由CATiledLayer调用的。当释放 UIViewController 时,你必须告诉 CATiledLayer 它的委托(delegate)不再存在。我向我的 CATiledLayer 添加了一个引用(分配),并在我的 dealloc 函数中添加了一个引用(分配):

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

我希望你不会像我一样输掉那么多次......

关于iphone - 导航 Controller 和包含子 CALayer 的 View 出现内存问题/过度释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5064855/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com