我有一个名为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,但是如何摆脱它。这是使用它的正确方法吗?
答案 0 :(得分:1)
就像注意一样:将 viewAccount 分配可能会导致僵尸(在原始代码段中),因为你在最后一行释放它。
我建议采用以下方法:
这是我用 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.