2011-03-25 83 views
0

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

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(UIView的子类)的dealloc方法没有被调用。如果我注释这两行代码,则会调用dealloc方法。

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

我想这个问题是有保留计数,它得到由1当我们使用insertSubview或addSubiew增加,但如何摆脱它。这是使用它的正确方法吗?

回答

1

增加保留计数就像一张纸条:让viewAccount分配CAN因为你在最后一行中释放了僵尸,所以导致了僵尸(原始代码片断)。

我建议以下方法:

  1. 让viewAccounts 保留再次
  2. ,因为你没有从该方法返回它
  3. 注重的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不叫。

BTW时,你只分配变量,那么你必须管理留住自己,如果你重新分配一个变量,特别是如果你无它。假设您将该变量设置为NIL,则片段可以再次执行。但是,你覆盖了变量,你是不能释放第一个值。如果您使用保留 Object-C将为您执行此操作。作为一个经验法则,我会一直使用保留的属性,直到你有足够的经验来处理其他案件。

+0

非常感谢您提供了很好的信息。自从我使用assign之后,应用程序正在退出。现在它工作正常。只是为了确保,如果我们保留一个属性,在dealloc方法中,应该使用self.anyProperty = nil还是仅仅是[anyProperty release]或者两者兼而有之? – iHS 2011-03-26 00:11:50

0

您可以将您的objViewAccounts设置为autorelease,因为无论如何都会保留self.view。

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

另外,关于保留计数,如果属性self.viewAccounts声明为保留,这也将增加1

+0

谢谢。属性self.viewAccounts被声明为保留。现在我已经改变它分配。我认为autorelease没有任何区别,它只是将保留计数减1。我认为释放方法也会做同样的事情,除了我们明确地称它为止。我不确定,为什么分配这个伎俩。无论如何感谢很多:) – iHS 2011-03-25 22:40:10

+0

没问题:),那是因为分配不增加保留计数。 – 2011-03-25 22:43:07