模拟场景:
- 在一个控制器a的view中添加另一个控制器b的view,如果只是把b.view添加到a.view中,会存在的问题:
- 1.重复创建过多的控制器b(b是局部变量,每次都会创建)
- 2.出现了不好的现象:控制器b已经死了(因为是局部变量,所在代码块结束就会死),
但是控制器的view还在(因为b.view添加到了a.view中,所以不会死),
这样再去操作b.view上的控制事件(例如button点击),
程序就会崩溃
- (IBAction)oneClick {
XMGOneViewController *one = [[XMGOneViewController alloc] init];
one.view.frame = CGRectMake(0, 64, self.view.frame.size.width, self.view.frame.size.height - 64);
[self.view addSubview:one.view];
}
- 如果对控制器b进行处理:定义为属性,并且强引用,进行懒加载可以解决上面的问题,又出现新的问题:
3.3个控制器的view同时出现了(层叠了),也就是会同时绘制,渲染3个view,占用了系统很多资源
// 以下代码省略了2,3控制器,只列举了第一个
@interface ViewController ()
/** one控制器 */
@property (nonatomic, strong) XMGOneViewController *one;
@end
@implementation ViewController
- (IBAction)oneClick {
// 创建控制器
if (self.one == nil) {
self.one = [[XMGOneViewController alloc] init];
self.one.view.frame = CGRectMake(0, 64, self.view.frame.size.width, self.view.frame.size.height - 64);
}
// 添加控制器的view
[self.view addSubview:self.one.view];
}
@end
-
只要控制器在,控制器的view就在,因为控制器对view是强引用strong,也就是只要控制器在,就有一个强指针指向view,view就不会被销毁,即使view被removeFromSuperView,view也不会销毁,只是不会显示在superView
网友评论