iphone SDK:未调用UIView dealloc。为什么?
问题描述:
我有一个名为TiledImage的自定义UIView,它具有一个名为tiledImage的属性和一个自定义drawRect方法。我将这个视图添加到我的ViewController中,但是当ViewController被释放时,这个视图的dealloc永远不会被调用,即使我释放视图并将其设置为nil。什么可能导致这个?我没有任何其他的视图引用,所以我的理解是它应该正确释放。iphone SDK:未调用UIView dealloc。为什么?
这是我如何添加视图到我的视图控制器:
NSString *imagePath = [[NSBundle mainBundle] pathForResource:@"tile" ofType:@"png"];
UIImage *image = [[UIImage alloc] initWithContentsOfFile:imagePath];
self.backImageView = [[TiledImage alloc] initWithFrame:IMAGE_FRAME];
self.backImageView.tiledImage = image;
[self.view addSubview:self.backImageView];
[self.view sendSubviewToBack:self.backImageView];
[image release];
而且在我的ViewController的dealloc方法我有这样的:
_backImageView.tiledImage = nil, [_backImageView release], _backImageView = nil;
这行代码被击中,但dealloc的是从未呼吁TiledView。请注意,_backImageView是属性backImageView使用的var。
有人可以给我的想法,我可能会做的错误是阻止dealloc TiledImage对象被调用?
答
如果self.backImageView
是retain
属性,则表明存在内存泄漏 - TiledImage
在调用setter之前保留计数为1,之后为2。
您添加视图的代码应该看起来像代替如下:
TiledImage *imageView = [[TiledImage alloc] initWithFrame:IMAGE_FRAME];
self.backImageView = imageView;
[imageView release];
+0
一些显而易见的东西,我一遍又一遍地看着。谢谢。我可以回顾一下可可内存管理指南。 – memmons 2010-05-14 17:38:27
它看起来像你在泄漏记忆。当引用计数为零时,将调用“dealloc”。你可以在你创建'TileImage'的地方发布代码吗?也许你把它设置为“保留”属性,永远不会释放它,或者类似的东西。 – pgb 2010-05-12 19:41:17