面试题(二十)

一.哪些情况出现循环引用
计时器NSTimer:外部暴露清理定时器的方法
blcok: 使用copy,即使在你的block代码中没有显式地出现"self",也会出现循环引用!只要你在block里用到了self所拥有的东西
委托delegate:出现循环引用问题

二.多线程的使用
NSThread、NSOperation、GCD

三.资源竞争,加锁
@synchronized
NSLock
NSRecursiveLock,递归锁
NSConditionLock,条件锁
NSDistributedLock,分布锁
dispatch_semaphore
os_unfair_lock
OSSpinLock
POSIX Conditions
pthread_rwlock
pthread_mutex

四.UITableView 的优化
数据源方法优化
定义一种(尽量少)类型的Cell
善用hidden隐藏(显示)subviews
提前计算并缓存Cell的高度
定高的cell,应该采用如下方式:
self.tableView.rowHeight = 88;//不再实现delegate 返回行高代理方法
动态行高:self.myTableView.estimatedRowHeight = 44.0;
    self.myTableView.rowHeight = UITableViewAutomaticDimension;
异步绘制(自定义Cell绘制)
滑动时,按需加载
避免大量的图片缩放、颜色渐变等,尽量显示“大小刚好合适的图片资源”
缓存View
避免同步的从网络、文件获取数据,Cell内实现的内容来自web,使用异步加载,缓存请求结果
减少subviews的个数和层级少用subviews的透明图层
避免CALayer特效(shadowPath)

五.UITableView不固定行高的几种实现方式
六.为什么block要用copy修饰,使用assign/weak,strong,retain修饰有什么问题,编译时,运行时会报错么
block从本身在堆区,而是让block在堆区自动管理
block是存档在栈中,可能被随时回收,通过copy操作可以使其在堆中保留一份, 相当于一直强引用着, 因此如果block中用到self时, 需要将其弱化, 通过__weak或者__unsafe_unretained.
使用 assign修饰时编译可以通过,但是运行时会crash,因为block使用的weak修饰,block存在于栈中,self又保存在block中,所以self也再栈里面,当执行完_block()之后,block就马上把自己释放掉了,从而self也一同没了。然后这句话缺没有完,在这个语法块里面还有self等一些列语句的时候他又会马上回调到b类去改变颜色。  
转移成汇编代码的话他就会把self当做一个地址,然后call回去继续执行。但是这个时候self已经被释放掉了,当再次call回去的时候他的函数表里面已经没有任何东西了,函数名比较就通不过,让系统认为没有这个可执行的函数,则编译无法继续执行。
使用strong/retain 编译,运行都不会出现问题,但是有可能会出现循环引用问题,内存泄漏
七.nsstring 使用什么修饰符,为什么要使用这个修饰符

八.Block内部修改变量需要注意的事项
九.没有bug分析统计,客户反馈crash,怎么处理
首先问客户机型、系统版本号,让测试人员重现
十.Swift函数式编程的特性,filter,map实现的原理
十一.ReactNative的优点,为什么比别的混合技术性能要高
十二.ReactiveCocoa实现的通信方式,特点
十三.设计模式:MVC, MVVM, MVP, VIPER 区别与优缺点
十四.属性的修饰符有哪些,什么情况使用哪种
十五.分类category添加属性,调用了runtime的什么方法实现的
十六.看过哪些源码
十七.UICollectionView的优化

原文地址:https://www.cnblogs.com/shidaying/p/8136327.html