-(void)viewDidLoad
多次创建视图对象
场景
外部创建
vc
,并在对vc
属性赋值时(vc.dataSource = @[]),在vc内部
dataSource
属性的set
方法中调用了懒加载控件tableView
,这时候,会进入到tableView的懒加载方法中,并创建tableView1
如果在
tableView 1
被创建完成之前,引用了vc.view
,(比如:
_tableView = [[UITableView alloc]initWithFrame:self.view.bounds style:UITableViewStylePlain];
)如果这个时候,
vc.view == nil;
则会调用vc
的viewDidLoad
方法,创建vc
的view
如果在
ViewDidLoad
方法中,调用了self.tableView
,那么就又会进入tableView
的懒加载方法中,再次创建一个tableView2
如果 然后 在
viewDidLoad
中 进行了[self.view addSubview: self.tableView]
这时候添加的应该是tableView2
运行完
vc
的viewDidLoad
方法后,会继续回到tableView1
的懒加载中,进行创建tableView1
,这时
vc
的懒加载属性tableView
应该为tableView1
,而在vc.view
视图上的tableView
应该为tableView2
代码示例
-
外部创建vc
UIViewController *vc = [UIViewController new] vc.dataSource = @[];
-
vc内部
- (void)setDataSource:(NSArray<NSString *> *)dataSource { _dataSource = dataSource; [self.tableView reloadData]; } - (UITableView *)tableView{ if (!_tableView) { _tableView = [[UITableView alloc]initWithFrame:self.view.bounds style:UITableViewStylePlain]; _tableView.separatorStyle = UITableViewCellSeparatorStyleNone; //register cell ... } return _tableView; }
解决
1. 在tableView懒加载内部不要使用self.view
网友评论