UIView子类的Dealloc方法没有被调用

时间:2011-03-25 22:22:17

标签: iphone objective-c xcode ios memory-management

我有一个名为SettingsViewController的视图控制器,以及一个名为ViewAccounts的自定义UIView子类。在SettingsViewController中,我使用下面的代码将ViewAccounts视图添加到SettingsViewController中。

 if(!self.viewAccounts)
 {
      ViewAccounts *objViewAccounts= [[ViewAccounts alloc] initWithFrame:CGRectMake(0, yViews, 320, 400) withViewController:self];
      [self.view insertSubview:objViewAccounts atIndex:0];
      self.viewAccounts = objViewAccounts;
      [objViewAccounts release];
}

问题是ViewAccounts的dealloc方法(UIView的子类)没有被调用。如果我对这两行代码进行注释,则会调用dealloc方法。

[self.view insertSubview:objViewAccounts atIndex:0];
self.viewAccounts = objViewAccounts;

我猜问题是保留计数,当我们使用insertSubview或addSubiew时,它会增加1,但是如何摆脱它。这是使用它的正确方法吗?

2 个答案:

答案 0 :(得分:1)

就像注意一样:将 viewAccount 分配可能会导致僵尸(在原始代码段中),因为你在最后一行释放它。

我建议采用以下方法:

  1. 再次使viewAccounts 保留
  2. 请勿使用autorelease,因为您没有从该方法返回
  3. 请注意代码段
  4. 中方法的 dealloc 方法

    这是我用 viewAccounts 保留

    编写代码段的方式
    if(!self.viewAccounts)
    {
      ViewAccounts *objViewAccounts= [[ViewAccounts alloc] initWithFrame:CGRectMake(0, yViews, 320, 400) withViewController:self];
      [self.view addSubview:objViewAccounts];
      self.viewAccounts = objViewAccounts;
      [objViewAccounts release];
    }
    ...
    - (void) dealloc {
        [super dealloc];
        [viewAccounts release];
        ...
    }
    

    原始代码中发生的情况是保留变量 viewAccounts 在此类生命周期结束时未正确释放,因此未调用dealloc。

    顺便说一下,如果你只指定变量,那么你必须自己管理保留,如果你重新分配那个变量,特别是如果你没有它。假设您将变量设置为NIL,则可以再次执行该代码段。但是然后你覆盖变量并且你不能来释放第一个值。如果您使用保留,Object-C将为您执行此操作。根据经验,我总是会使用保留作为属性,直到您有足够的经验来处理其他情况。

答案 1 :(得分:0)

您可以将objViewAccounts设置为自动释放,因为无论如何它都会被self.view保留。

ViewAccounts *objViewAccounts= [[[ViewAccounts alloc] initWithFrame:CGRectMake(0, yViews, 320, 400) withViewController:self] autorelease];

同样关于保留计数,如果将属性self.viewAccounts声明为retain,那么也会将保留计数增加1.