删除视图后如何释放UIVIewController

时间:2011-08-30 20:19:38

标签: iphone ios uiview uiviewcontroller

如何发布如下所示的视图控制器:

VCClass *vc = [[VCClass alloc] initWithNibName:@"VCClass" bundle:nil];
[self.view addSubview:vc.view];

因此视图出现,UIViewController被分配。现在我想从VCClass中释放它。我在VCClass里面打电话:

[self.view removeFromSuperView];

我的问题是,我应该在哪里发布附加到已删除视图的“vc”对象。是否有一种通知viewcontroller的好方法可以在发布视图时释放?

4 个答案:

答案 0 :(得分:1)

addSubview做了+1的保留计数,它通常是一个很好的做法,只要你不需要它释放,而你递给另一个指针。它就像一个玻璃球,它是手工传递的,如果没有人拿着它,它会落到地上并且会断裂。

示例:

UIView *sampleView = [[UIView alloc] init]; // Retain count: 1
[self.view addSubview:sampleView];          // Retain count: 2
[self.view release];                        // Retain count: 1

调用removeFromSubview:时,对象将被释放:

[sampleView removeFromSuperView];           // Retain count: 0

这是内存管理。

回答你的问题,更安全的方式做你想做的事(装载只是一个视图控制器从笔尖(我假设你使用的是笔尖部分吧,因为你使用@"VCClass"initWithNibName:),就是按照以下方式使用它:

NSArray *nib =  [[NSBundle mainBundle] loadNibNamed:@"VCClass" owner:self options:nil];

UIView *view = (UIView*)[nib objectAtIndex:0];

此工作通过装载NibName到内存中,然后窃取的第一个元素(如果只有内部一个UIView,那么它会选择的是,作为最上面的元素)。对于UITableViewCells从nib文件加载它们时,这类似地完成。 Nib文件是自动释放的,它更有意义,因为你显然只关心视图本身,而不是控制器。

答案 1 :(得分:0)

删除后,添加对

的调用
[self autorelease];

答案 2 :(得分:0)

除了作为委托的弱引用之外,视图不知道它们的视图控制器。这是为了避免循环引用,以及其他原因。 VC通常在视图之外有生命 - 因此,viewDidLoad和viewDidUnload消息。例如,在标签栏应用程序的整个生命周期中,每个选项卡的VC可能会经历许多不同的视图实例,而从未被释放。因此,您应该避免让视图发布自己的视图控制器。

通常,分配VC的类应该是释放它的类。在您提供的代码中,您有:

VCClass *vc = [[VCClass alloc] initWithNibName:@"VCClass" bundle:nil];
[self.view addSubview:vc.view];

上述代码所在的控制器类可能是最适合释放VC的地方。您可能需要为此目的设计一个委托调用。

答案 3 :(得分:-1)

[self.view removeFromSuperView];应该从记忆中释放你的观点。虽然如果你的视图被任何其他对象保留,但是它的保留计数超过1,则会发出警告。但是请看这个帖子的第二个答案。

Does UIView's removeFromSuperView method remove the UIView from memory