iOS面试关于多线程和tableview优化的具体回答

其实 我们都对多线程、block、代理 、MVC等都有自己的理解,每个程序员的理解不同,但是一到像我这样的新手紧张的时候,就不知道如何有逻辑地回答了,现在就总结一下,具体怎么回答

多线程

面试官:谈一谈对多线程的理解

  • 一个程序至少要有一个进程,一个进程至少要有一个线程,在iOS应用中,我们对多线程最初的理解,就是并发,它的含义是原来先做烧水,再摘菜,再炒菜的工作,会变成烧水的同时去摘菜,最后去炒菜 (我们为什么用多线程)
  • 我们iOS最常用的GCDNSOperationNSThread,他们三者中我更青睐于GCD (多线程的封装有哪些,你更常用什么)
  • 因为NSThread的线程之间的并发控制,是需要我们自己来控制的即我们要手动管理线程生命周期,不是很方便,虽然项目中使用NSOperation会使项目的程序结构更好,子类化NSOperation的设计思路,是具有面向对象的优点(复用、封装),使得实现是多线程支持,而接口简单,建议在复杂项目中使用,但是GCD的API接口为C语言的函数,函数参数中多数有Block, 为我们提供强大的“接口,会使代码更为易读,GCD本身非常简单、易用,对于不复杂的多线程操作,会节省代码量(谈谈为什么用)
  • 值得注意的是atomic的本意是指属性的存取方法是线程安全的(thread safe),并不保证整个对象是线程安全的
  • 我的项目中用到了多线程,就是一边请求时间一边请求聊天室内容,我就开了两个线程,UI展示在主线程(结合自己项目)

tableviewcell的重用和优化

谈谈对tableview的优化

  • UITableViewCell对象的重用原理:当滚动列表时,部分UITableViewCell会移出窗口,UITableView会将窗口外的UITableViewCell放入一个对象池中,等待重用。当UITableView要求dataSource返回UITableViewCell时,dataSource会先查看这个对象池,如果池中有未使用的UITableViewCell,dataSource会用新的数据配置这个UITableViewCell,然后返回给UITableView,重新显示到窗口中,从而避免创建新对象
  • 尽量少用或不用透明图层
  • 如果Cell内现实的内容来自web,使用异步加载,缓存请求结果
  • 减少subviews的数量
  • 尽量少用addView给Cell动态添加View,可以初始化时就添加,然后通过hide来控制是否显示
  • 提前计算并缓存好高度(布局),因为heightForRowAtIndexPath:是调用最频繁的方法;
  • 缓存图片SDWebImage
    性能优化要注意平衡CPU和GPU的负载

你可能感兴趣的:(iOS面试关于多线程和tableview优化的具体回答)