代码之家  ›  专栏  ›  技术社区  ›  memmons

iPhone SDK:未调用uiview dealoc。为什么?

  •  3
  • memmons  · 技术社区  · 14 年前

    我有一个名为tiledimage的自定义uiview,它有一个名为tiledimage的属性和一个自定义drawrect方法。我将此视图添加到我的ViewController,但当解除分配ViewController时,将永远不会调用此视图的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;
    

    该行代码被命中,但从未在tiledview上调用dealloc。请注意,backImageView是backImageView属性使用的var。

    有人能告诉我我可能做错了什么,从而阻止调用tileImage对象上的dealLoc吗?

    1 回复  |  直到 14 年前
        1
  •  7
  •   Georg Fritzsche    14 年前

    如果 self.backImageView 是一个 retain 属性,您有内存泄漏- TiledImage 在调用setter之前保留计数为1,在调用setter之后保留计数为2。

    用于添加视图的代码应如下所示:

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