1.创建timer有哪几种方式,有什么区别?CADisplayLink和NSTimer的区别?
2.UITableView那几个代理方法的调用顺序?假设有100个Cell,当前屏幕只能显示10个,调用reloadData后,heightForRow方法会执行多少次?预估高度这个属性是为了解决什么问题而诞生的,它有什么特性?
我测试了一下,测试设备:iphone6,系统8.1和10.0;
我们通过两种创建cell的方式来作为对比:
第一种:
#import "ViewController.h"
@interface ViewController ()
// 用来测试heightForRow方法的调用次数
@property (nonatomic, assign) NSInteger callTimes;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[self.tableView registerClass:UITableViewCell.class forCellReuseIdentifier:@"reuseId"];
self.callTimes = 0;
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
NSLog(@"%s", __func__);
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
NSLog(@"%s", __func__);
return 3;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSLog(@"%s, 这是第%ld个组,第%ld个行的cell", __func__, indexPath.section, indexPath.row);
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"reuseId" forIndexPath:indexPath];
cell.textLabel.text = [NSString stringWithFormat:@"这是第%ld个cell", indexPath.row];
return cell;
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
self.callTimes += 1;
NSLog(@"%ld,这是第%ld个组,第%ld个行的cell", _callTimes, indexPath.section, indexPath.row);
NSLog(@"%s", __func__);
return ([UIScreen mainScreen].bounds.size.height - 64) / 2;
}
打印结果为:
2016-10-18 14:51:42.719 tableView测试[36378:3706092] -[ViewController numberOfSectionsInTableView:]
2016-10-18 14:51:42.719 tableView测试[36378:3706092] -[ViewController tableView:numberOfRowsInSection:]
2016-10-18 14:51:42.720 tableView测试[36378:3706092] 1,这是第0个组,第0个行的cell
2016-10-18 14:51:42.720 tableView测试[36378:3706092] -[ViewController tableView:heightForRowAtIndexPath:]
2016-10-18 14:51:42.720 tableView测试[36378:3706092] 2,这是第0个组,第1个行的cell
2016-10-18 14:51:42.720 tableView测试[36378:3706092] -[ViewController tableView:heightForRowAtIndexPath:]
2016-10-18 14:51:42.720 tableView测试[36378:3706092] 3,这是第0个组,第2个行的cell
2016-10-18 14:51:42.720 tableView测试[36378:3706092] -[ViewController tableView:heightForRowAtIndexPath:]
2016-10-18 14:51:42.721 tableView测试[36378:3706092] -[ViewController tableView:cellForRowAtIndexPath:], 这是第0个组,第0个行的cell
2016-10-18 14:51:42.721 tableView测试[36378:3706092] 4,这是第0个组,第0个行的cell
2016-10-18 14:51:42.721 tableView测试[36378:3706092] -[ViewController tableView:heightForRowAtIndexPath:]
2016-10-18 14:51:42.764 tableView测试[36378:3706092] 5,这是第0个组,第0个行的cell
2016-10-18 14:51:42.764 tableView测试[36378:3706092] -[ViewController tableView:heightForRowAtIndexPath:]
2016-10-18 14:51:42.765 tableView测试[36378:3706092] -[ViewController tableView:cellForRowAtIndexPath:], 这是第0个组,第1个行的cell
2016-10-18 14:51:42.765 tableView测试[36378:3706092] 6,这是第0个组,第1个行的cell
2016-10-18 14:51:42.765 tableView测试[36378:3706092] -[ViewController tableView:heightForRowAtIndexPath:]
2016-10-18 14:51:42.765 tableView测试[36378:3706092] 7,这是第0个组,第1个行的cell
2016-10-18 14:51:42.766 tableView测试[36378:3706092] -[ViewController tableView:heightForRowAtIndexPath:]
在以第二种方式创建cell:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSLog(@"%s, 这是第%ld个组,第%ld个行的cell", __func__, indexPath.section, indexPath.row);
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"reuseId"];
if (!cell) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"reuseId"];
}
cell.textLabel.text = [NSString stringWithFormat:@"这是第%ld个cell", indexPath.row];
return cell;
}
这种方式打印结果为:
2016-10-18 14:45:27.626 tableView测试[36298:3680069] -[ViewController numberOfSectionsInTableView:]
2016-10-18 14:45:27.627 tableView测试[36298:3680069] -[ViewController tableView:numberOfRowsInSection:]
2016-10-18 14:45:27.627 tableView测试[36298:3680069] 1,这是第0个组,第0个行的cell
2016-10-18 14:45:27.628 tableView测试[36298:3680069] -[ViewController tableView:heightForRowAtIndexPath:]
2016-10-18 14:45:27.628 tableView测试[36298:3680069] 2,这是第0个组,第1个行的cell
2016-10-18 14:45:27.628 tableView测试[36298:3680069] -[ViewController tableView:heightForRowAtIndexPath:]
2016-10-18 14:45:27.628 tableView测试[36298:3680069] 3,这是第0个组,第2个行的cell
2016-10-18 14:45:27.629 tableView测试[36298:3680069] -[ViewController tableView:heightForRowAtIndexPath:]
2016-10-18 14:45:27.630 tableView测试[36298:3680069] -[ViewController tableView:cellForRowAtIndexPath:], 这是第0个组,第0个行的cell
2016-10-18 14:45:27.633 tableView测试[36298:3680069] 4,这是第0个组,第0个行的cell
2016-10-18 14:45:27.634 tableView测试[36298:3680069] -[ViewController tableView:heightForRowAtIndexPath:]
2016-10-18 14:45:27.635 tableView测试[36298:3680069] -[ViewController tableView:cellForRowAtIndexPath:], 这是第0个组,第1个行的cell
2016-10-18 14:45:27.635 tableView测试[36298:3680069] 5,这是第0个组,第1个行的cell
2016-10-18 14:45:27.635 tableView测试[36298:3680069] -[ViewController tableView:heightForRowAtIndexPath:]
对比之后,我们可以得出结论:
调用顺序:
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
而且通过测试发现,通过第一种方式创建的cell在调用- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
方法时,最后会调用2次。
3.如何用TableView实现CollectionView,或者CollectionView实现tableView?
4.MVC设计模式解决了一个什么问题?
5.dispatch_barrier相关函数的作用?
6.一个View旋转后frame和bounds具体怎么变化的。
7.在A线程中发出的NSNotification在B线程中是否能收到?
8.什么时候子线程要开启NSRunloop,不开启的话会怎么样?(SDWebImage的原理)
http://blog.csdn.net/wzzvictory/article/details/9237973
9.tableView的性能优化有哪几种?什么是离屏渲染?
10.GCD和NSOperation的区别?
———————————— 以上是百度外卖的面试题 ——————————-
https和http的区别?
http://www.cnblogs.com/HedgehogBlog/p/4957561.html
http://www.jianshu.com/p/13c09f4e6fac