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对象被调用?

+0

它看起来像你在泄漏记忆。当引用计数为零时,将调用“dealloc”。你可以在你创建'TileImage'的地方发布代码吗?也许你把它设置为“保留”属性,永远不会释放它,或者类似的东西。 – pgb 2010-05-12 19:41:17

如果self.backImageViewretain属性,则表明存在内存泄漏 - TiledImage在调用setter之前保留计数为1,之后为2。

您添加视图的代码应该看起来像代替如下:

TiledImage *imageView = [[TiledImage alloc] initWithFrame:IMAGE_FRAME]; 
self.backImageView = imageView; 
[imageView release]; 
+0

一些显而易见的东西,我一遍又一遍地看着。谢谢。我可以回顾一下可可内存管理指南。 – memmons 2010-05-14 17:38:27