IBOutlet未发布

时间:2012-08-21 11:50:29

标签: uiview release retain iboutlet

我有这个问题。我有两个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

但是我应该收到一条消息“发送给navBar和contentView的deallocated实例,就像我和self.view一样。我很确定我不会将它们保留在其他任何地方或者将它们添加到其他视图中。” p>

任何建议都将不胜感激。

2 个答案:

答案 0 :(得分:1)

  

在我完成所有发布后,contentView和navBar仍然没有   解除分配。

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

  1. 这些视图可能是控制器视图的子视图(因此由控制器视图保留)。控制器的视图只会在UIViewController dealloc中发布,dealloc发生在您UIViewController end ,所以它没有发生在你把它记录下来。
  2. 由于您正在使用xib加载视图控制器,因此视图控制器会在加载时保留xib及其所有对象。同样,这将在dealloc的{​​{1}}中发布,该dealloc发生在{{1}}的 end
  3. 如果有人保留然后自动释放它们,它们仍然可以由自动释放池保留。 (许多代码保留然后自动释放对象,因为这样做是绝对错误的。)因此,确切地说,取消分配对象并不总是可预测的。只是担心在你的头上正确地进行内存管理,不要担心。

答案 1 :(得分:-1)

我假设您正在使用xib。

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

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