0

我有这个问题。我有两个 IBOutlets 和属性,我保留它们。

@interface MCNavigationController : UIViewController 

@property (retain, nonatomic) IBOutlet UIView *contentView;
@property (retain, nonatomic) IBOutlet MCNavBar *navBar;

@end

问题是在dealloc中,在我完成所有发布之后,contentView和navBar仍然没有被释放。

- (void)dealloc
{
    [contentView release];
    NSLog(@"%@",contentView.superview);
    [navBar release];
    NSLog(@"%@",navBar.superview);
    NSLog(@"%@",self.view);

    [super dealloc];
    NSLog(@"%@",navBar.superview);
    NSLog(@"%@",contentView.superview);
    NSLog(@"%@",self.view);

}

在日志中,这就是我得到的:

2012-08-21 14:48:05.646 ShopRite[4250:12503] <UIView: 0x66b77d0; frame = (0 0; 320 416); clipsToBounds = YES; autoresize = W+H; layer = <CALayer: 0x66b7800>>
2012-08-21 14:48:05.649 ShopRite[4250:12503] <UIView: 0x66b77d0; frame = (0 0; 320 416); clipsToBounds = YES; autoresize = W+H; layer = <CALayer: 0x66b7800>>
2012-08-21 14:48:05.650 ShopRite[4250:12503] <UIView: 0x66b77d0; frame = (0 0; 320 416); clipsToBounds = YES; autoresize = W+H; layer = <CALayer: 0x66b7800>>
2012-08-21 14:48:05.650 ShopRite[4250:12503] <UIView: 0x66b77d0; frame = (0 0; 320 416); clipsToBounds = YES; autoresize = W+H; layer = <CALayer: 0x66b7800>>
2012-08-21 14:48:05.651 ShopRite[4250:12503] <UIView: 0x66b77d0; frame = (0 0; 320 416); clipsToBounds = YES; autoresize = W+H; layer = <CALayer: 0x66b7800>>
2012-08-21 14:48:13.726 ShopRite[4250:12503] *** -[MCNavigationController view]: message sent to deallocated instance 0x66b5f20

但我应该得到一个“发送到导航栏和内容视图的释放实例的消息,就像我为 self.view 设置的一样。我很确定我不会将它们保留在其他任何地方或将它们添加到其他视图。

任何建议将不胜感激。

4

2 回答 2

1

在我完成所有发布之后,contentView 和 navBar 仍然没有被释放。

可以通过多种方式保留这些观点:

  1. 这些视图可能是控制器视图的子视图(因此由控制器视图保留)。并且控制器的视图只会在UIViewController's中发布dealloc,这发生在你的末尾dealloc,所以它没有发生在你记录它的地方。
  2. 由于您正在使用 xib 加载视图控制器,因此视图控制器在加载时会保留 xib 及其所有对象。同样,这将在UIViewController's中发布dealloc,这发生在dealloc.
  3. 如果有人保留然后自动释放它们,它们仍然可以被自动释放池保留。(许多代码保留然后自动释放对象,因为这样做永远不会出错。)因此,对象被释放的确切时间并不总是可以预测的。只需担心最终正确地进行内存管理,而不必担心。
于 2012-08-21T19:23:08.230 回答
-1

我假设您将它与 xib 一起使用。

如果您使用的是 xib,那么它将在从 superview 中删除或从窗口中删除时被释放。

当我们使用 IBOutlet 时,我们不需要发布。

于 2012-08-21T12:09:50.127 回答