模擬場(chǎng)景:
- 在一個(gè)控制器a的view中添加另一個(gè)控制器b的view,如果只是把b.view添加到a.view中,會(huì)存在的問題:
- 1.重復(fù)創(chuàng)建過多的控制器b(b是局部變量,每次都會(huì)創(chuàng)建)
- 2.出現(xiàn)了不好的現(xiàn)象:控制器b已經(jīng)死了(因?yàn)槭蔷植孔兞?所在代碼塊結(jié)束就會(huì)死),
但是控制器的view還在(因?yàn)閎.view添加到了a.view中,所以不會(huì)死),
這樣再去操作b.view上的控制事件(例如button點(diǎn)擊),
程序就會(huì)崩潰
- (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];
}
- 如果對(duì)控制器b進(jìn)行處理:定義為屬性,并且強(qiáng)引用,進(jìn)行懶加載可以解決上面的問題,又出現(xiàn)新的問題:
3.3個(gè)控制器的view同時(shí)出現(xiàn)了(層疊了),也就是會(huì)同時(shí)繪制,渲染3個(gè)view,占用了系統(tǒng)很多資源
// 以下代碼省略了2,3控制器,只列舉了第一個(gè)
@interface ViewController ()
/** one控制器 */
@property (nonatomic, strong) XMGOneViewController *one;
@end
@implementation ViewController
- (IBAction)oneClick {
// 創(chuàng)建控制器
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就在,因?yàn)榭刂破鲗?duì)view是強(qiáng)引用strong,也就是只要控制器在,就有一個(gè)強(qiáng)指針指向view,view就不會(huì)被銷毀,即使view被removeFromSuperView,view也不會(huì)銷毀,只是不會(huì)顯示在superView
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。