日常问题总结,有些问题面会广一点,便单独拿出来写一篇;
1、GCD与NSOperationQueue的区别;
Grand Central Dispatch(GCD) 是 Apple 开发的一个多核编程的较新的解决方法。它主要用于优化应用程序以支持多核处理器以及其他对称多处理系统。
NSOperation是常见的多线程方案,是对GCD的封装,采用OC方法,更加面向对象。
主要区别:
- GCD是纯C语言的API ,NSOperationQueue是基于GCD的OC的封装;
- GCD只支持FIFO队列(先进先出队列),NSOperationQueue可以方便设置执行顺序,设置最大的并发数量;
- NSOperationQueue可是方便的设置operation之间的依赖关系,GCD则需要很多代码;
- NSOperationQueue支持KVO,可以检测operation是否正在执行(isExecuted),是否结束(isFinishe),是否取消(isCanceled);
- GCD的执行速度比NSOperationQueue快。
2、SDWebImage主要有哪些类;实现原理;自己写一个类似组件解析的思路;
3、本地有一个存储整型数据、2G大小的文件,如何实现将其按大小排序并存储于200M的内存中;
4、查找到view1、view2的共同父视图;
- (UIView *)getCommonSuperViewWithFirstView:(UIView *)firstView secondView:(UIView *)secondView {
UIView *commonSuperView = nil;
UIView *firstSuperView = firstView;
while (!commonSuperView && firstView && secondView) {
UIView *secondSuperView = secondView;
while (!commonSuperView && firstSuperView && secondSuperView) {
if (secondSuperView == firstSuperView) {
return secondSuperView;
}
secondSuperView = secondSuperView.superview;
}
firstSuperView = firstSuperView.superview;
}
return commonSuperView;
}
5、AFNetworking主要有哪些类,熟悉源码实现;
NSURLSession:AFHTTPSessionManager、AFURLSessionManager;
Reachability:AFNetworkReachabilityManager
Security:AFSecurityPolicy
Serialization:AFURLRequestSerialization、AFURLResponseSerialization
6、runtime应用场景,数据类型转换中的应用解析(即如何实现);
** runtime 常见的应用场景:**
- 在类别中使用 runtime 动态添加属性:objc_getAssociatedObject、objc_setAssociatedObject;
- 获取类的属性和成员变量:class_copyPropertyList(属性)、class_copyIvarList(属性和成员变量);
- 动态添加或交换类的方法:class_addMethod(动态添加方法)、class_replaceMethod(动态替换方法)、method_exchangeImplementations(动态交换方法);
类型转换解析:
应用 class_copyPropertyList 将数据对应转换为相应的类型;
7、多线程有哪些锁的种类?及其应用;
锁的种类:@sychronized、NSLock、NSRecursiveLock、NSConditionLock;
8、http请求上传文件的过程解析;
9、数据库索引定义有哪些规则?
10、如何实现组件化业务库之间的解耦?
定义中间件,以协议的形式进行业务库间的页面跳转及数据传递;
11、runloop与定时器的使用?定时器在tableView滑动时会怎样?如何解决?
问题答案已在单独一篇中提及,此处贴一下:iOS定时器的添加方式
12、24种设计模式知道哪些?工厂模式的特点;
设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。总体来说设计模式分为三大类:
-
创建型模式
简单工厂模式、工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 -
结构型模式:
适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 -
行为型模式
策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
13、线上版本的崩溃如何去定位?
通过查看crash log去定位;
1、针对线上版本,可通过 iTunes Connect -> APP 分析 查看crash log,前提是手机需要开启 诊断与用量,在 设置 --> 隐私 --> 诊断与用量;
2、自己手机安装、操作、crash,连接xcode查看crash log;
3、集成搜集崩溃日志的第三方,如Bugly、Fabric、FLCrashReport等;
14、工程中使用到的数据持久化的方式;
NSUserDefaults;plist 文件存储;sqlite 数据库存储;归档(Archiver);CoreData;
15、分类(Category)与扩展(Extension)的区别;
分类(Category)的作用
- 可以为已知的类添加方法,哪怕是你没有源码的类;
- 通过类目添加方法会成为原始类的一部分,调用与其他方法一致;
- 与原类中的方法同级;
- 在父类中添加类目子类会继承该类目中的方法,但在子类中添加类目父类无法拥有这些方法;
分类(Category)注意点 - 不能在类目中添加实例变量;
- 可以为同一类添加多个类目,但类目名和方法名不能重复;
- 如果添加的方法和系统重名,优先实现类目中的方法,因此,不能随意重写类的方法;
分类(Category)的局限性 - 无法向类中添加实例变量,如果需要添加实例变量则只能在子类中添加;
- 如果在类目中重写父类方法,可能导致super消息的断裂,因为在类目中的方法优先级高于父类。
扩展(Extension) - Extension中添加的属性、成员变量和方法属于私有属性和方法,必须要在相应类的主要@implementation代码块被实现;
- 类扩展只能针对自定义的类,不能给系统类增加类扩展。
- Extensions增加的方法如果与类的方法同名,会冲突报错。
16、自定义UICollectionViewFlowLayout的实现方式;
17、Delegate、Notification、Block 及 KVO各自的优缺点;
Delegate 是一种回调机制,是一对一的关系;而通知是基于观察者模式的一对多关系,会将消息发送给所有注册为观察者的对象;因此 delegate 的执行效率要比 notification 高,但必须要建立代理关系,还需防止出现循环引用;
KVO是观察者模式,结合KVC用来监测某个对象某个属性值得变化,然后将变化通知给所有注册的观察者;从某种程度上,KVO与Notification是一样的;
Notification 需要主动发送,然后由观察者接收,但却可在满足条件的情况下发送,不限于属性值,却发送者不需要关心消息有没有人接收,接受者也不需要关心消息是谁发出的;而KVO虽可以实时监测,但只限于属性值的变化;
Block 与 Delegte 一样也是一对一的通知,但 Block 更加轻便,不需要建立对象间的代理关系,但如果通信较多,还是建议使用 delegate ,代码结构清晰;