本人收到一位程序员前两天面试中碰到的笔试问题,整理出一份自己的见解跟答案,具体内容如下:
现场照片
面试题分享
第一题:请举例至少三条以上会造成UITableView卡顿的情况
1、上方这个注释我们可以翻译为。只加载缓冲好的图片,新的下载直到scrolling end,就是上拉下拉结束以后才去进行下载图片然后刷新
2、 使用不透明视图。
3、 重复创建不必要的table cell。
4、 视图的数目过多
5、 多余的绘制工作。
6、 没有预渲染图像。
7、 阻塞主线程。
tableView卡顿解决方案:
1.最常用的就是cell的重用,注册重用标识符(每当需要显示cell的时候,都会先去缓冲池中寻找可循环利用的cell,如果没有再重新创建cell)
2.减少cell中控件的数量(view是很大的对象,创建它会消耗较多资源,并且也影响渲染的性能。所以不用的不要加上去,不适用的可以先隐藏)
3.少使用addView 给cell动态添加view.
4.使用不透明视图(半透明情况下app需要消耗性能去渲染,不透明的视图可以极大地提高渲染的速度)。
5.使用局部更新(如果只是更新某组的话,使用reloadSection进行局部更新)
6.加载网络数据,下载图片,使用异步加载,并缓存.
7.不要实现无用的代理方法,tableView只遵守两个协议.
8.使用正确的数据结构来存储数据。
9.当处理一些全屏大图一类的耗资源的操作,可以用预渲染图像,在bitmap context里先将其画一遍,导出成UIImage对象,然后再绘制到屏幕。
第二题:ID类型的delegate属性到底是用assign还是weak,请简述原因
@property (nonatomic, assign, readwrite) id delegate;
声明一个delegate,那么即便delegate指向的对象销毁了,delegate中依然会保存之前对象的地址
即,delegate成为了一个野指针...
而使用weak,则不会有上述问题,当delegate指向的对象销毁后,delegate = nil,
所以答案就是,使用weak。
第三题:为什么IBOutlet修饰的UIView也适用weak关键词
因为当我们将控件拖到Storyboard上,相当于新创建了一个对象,而这个对象是加到视图控制器的view上,view有一个subViews属性,这个属性是一个数组,里面是这个view的所有子view,而我们加的控件就位于这个数组中,那么说明,实际上我们的控件对象是属于view的,也就是说view对加到它上面的控件是强引用。当我们使用Outlet属性的时候,我们是在viewController里面使用,而这个Outlet属性是有view来进行强引用的,我们在viewController里面仅仅是对其使用,并没有必要拥有它,所以是weak的。
如果将weak改为strong,也是没有问题的,并不会造成强引用循环。当viewController的指针指向其他对象或者为nil,这个viewController销毁,那么对控件就少了一个强引用指针。然后它的view也随之销毁,那么subViews也不存在了,那么控件就又少了一个强引用指针,如果没有其他强引用,那么这个控件也会随之销毁。
不过,既然没有必将Outlet属性设置为strong,那么用weak就好了
即将找工作或者跳槽的朋友更多更详细面试资料联系我哦~,也欢迎来我简书博客jianshu.com/p/5d895f7604ab,干货满满
大家好,喜欢我的面试资料的,可点击头像关注我,私信回复“你好”,就能找到我
原文地址:http://blog.51cto.com/13518796/2122486