如何发布如下所示的视图控制器:
VCClass *vc = [[VCClass alloc] initWithNibName:@"VCClass" bundle:nil];
[self.view addSubview:vc.view];
因此视图出现,UIViewController被分配。现在我想从VCClass中释放它。我在VCClass里面打电话:
[self.view removeFromSuperView];
我的问题是,我应该在哪里发布附加到已删除视图的“vc”对象。是否有一种通知viewcontroller的好方法可以在发布视图时释放?
答案 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