?? 可能會(huì)出現(xiàn)的BUG: View的懶加載執(zhí)行了兩次alloc
最近寫代碼時(shí)候遇到了懶加載執(zhí)行兩次的問題。代碼如下
@interface ViewController : UIViewController
@property (nonatomic, strong) UITableView *tableView;
@end
- (void)viewDidLoad {
[super viewDidLoad];
[self.view addSubview:self.tableView];
[self.tableView mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.mas_equalTo(0);
}];
}
/// 懶加載
- (UITableView *)tableView{
if (!_tableView) {
// self.view 可能會(huì)導(dǎo)致此處創(chuàng)建兩次
_tableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain];
// 應(yīng)改為??
// _tableView = [[UITableView alloc] initWithFrame:[UIScreen mainScreen].bounds style:UITableViewStylePlain];
_tableView.contentInset = UIEdgeInsetsMake(70, 0, 0, 0);
}
return _tableView;
}
正常的情況下乃坤,上面的代碼不會(huì)出現(xiàn)任何問題陶贼。代碼執(zhí)行的順序 viewDidLoad
-> self.tableView
-> self.tableView懶加載創(chuàng)建
->addSubview:
最后展示在view上面
這里會(huì)涉及一個(gè)概念: viewDidLoad什么時(shí)候調(diào)用
個(gè)人淺層理解:viewDidLoad 就是 vc.view的懶加載悦荒。只會(huì)執(zhí)行一次
這里有更詳細(xì)的圖文講解
出現(xiàn)問題的場(chǎng)景:在[[vc alloc] init]
之后 -> 外部調(diào)用并使用了vc.tableView
->[push:vc]
之前
這個(gè)時(shí)候上面的代碼就會(huì)出現(xiàn)tableView
的懶加載alloc
兩次的問題
問題原因: 代碼順序
-
[[vc alloc] init]
vc初始化 - 外部調(diào)用了
vc.tableView
執(zhí)行tableView
的懶加載。 - 這時(shí)
_tableView == nil
執(zhí)行了創(chuàng)建方法 - 因?yàn)?code>tableView創(chuàng)建的時(shí)候使用了
self.view.bounds
從而觸發(fā)了viewDidLoad
方法 -
viewDidLoad
內(nèi)部引用了self.tableView
執(zhí)行懶加載(get方法) - 這時(shí)
_tableView == nil
仍然為空混萝。再次執(zhí)行創(chuàng)建方法 - 最終導(dǎo)致了
alloc
兩次遗遵。
解決方法
將self.view.bounds
替換為[UIScreen mainScreen].bounds
疑問
為什么創(chuàng)建的時(shí)候Frame
不采用CGRectZero
。畢竟后面也用了Masonry