实战部分
1: AppDelegate如何瘦身?
一类注重于分发,比如 FRDModuleManager 和 JSDecoupledAppDelegate。 通过一定的机制,将Delegate分发到对应执行的业务单元上执行。而各个业务单元之间执行可以做到不互斥。但是要穷举所有的方法,进行转发也是个麻烦事。
一种是Category。这种虽然可以拆解,但是由于Category的技术限制,同一个方法不能出现在不同的Category中。结果导致了互斥。也就是说,同一个方法你只能写一份。不然就会出问题。
2: 反射是什么?可以举出几个应用场景么?
iOS反射机制:运行时选择创建哪个实例,并动态选择调用哪个方法。
常用判断方法
// 当前对象是否这个类或其子类的实例- (BOOL)isKindOfClass:(Class)aClass;// 当前对象是否是这个类的实例- (BOOL)isMemberOfClass:(Class)aClass;// 当前对象是否遵守这个协议- (BOOL)conformsToProtocol:(Protocol *)aProtocol;// 当前对象是否实现这个方法- (BOOL)respondsToSelector:(SEL)aSelector;
获取Class的三种方法
// 通过字符串获取class Classclass=NSClassFromString(@"NSString");NSLog(@"class type : %@",class);// 直接用class 来创建对象 ,通过对象来获取class idstr = [[classalloc] init];NSLog(@"%@", [strclass]);// 通过类来获取class NSLog(@"%d",class==NSString.class);
3: 有哪些场景是NSOperation比GCD更容易实现的?(或是NSOperation优于GCD的几点,知道多少说多少)
GCD主要特点:
1)GCG 是iOS4.0推出的,主要针对多核CPU 做了优化
2)GCD是 C 语言的技术
3)GCD 提供了一些 NSOperation 不具备的功能,比如一次性执行(创建单例),延迟执行,调度组.
NSOperation 特点:
-
NSOperation 是 iOS2.0后推出的,iOS4.0之后重写了NSOperation.
-
NSOperation 将操作(异步的任务)添加到队列(并发队列),就会执行制定操作的函数.
-
NSOperation里可以方便的设置操作:
1⃣️ 最大并发数
2⃣️ 队列的暂停/继续
3⃣️ 取消所有的操作
4⃣️ 指定操作之间的依赖关系(GCD可以用同步实现)
使用NSOperation 需要注意几点点:
-
注意避免产生循环依赖
-
要先设置依赖关系,然后添加到队列
GCD 和 NSOperation的区别主要表现在以下几方面:
-
GCD是一套 C 语言API,执行和操作简单高效,因此NSOperation底层也通过GCD实现,这是他们之间最本质的区别.因此如果希望自定义任务,建议使用NSOperation;
-
依赖关系,NSOperation可以设置操作之间的依赖(可以跨队列设置),GCD无法设置依赖关系,不过可以通过同步来实现这种效果;
-
KVO(键值对观察),NSOperation容易判断操作当前的状态(是否执行,是否取消等),对此GCD无法通过KVO进行判断;
-
优先级,NSOperation可以设置自身的优先级,但是优先级高的不一定先执行,GCD只能设置队列的优先级,如果要区分block任务的优先级,需要很复杂的代码才能实现;
-
继承,NSOperation是一个抽象类.实际开发中常用的是它的两个子类:NSInvocationOperation和NSBlockOperation,同样我们可以自定义NSOperation,GCD执行任务可以自由组装,没有继承那么高的代码复用度;
-
效率,直接使用GCD效率确实会更高效,NSOperation会多一点开销,但是通过NSOperation可以获得依赖,优先级,继承,键值对观察这些优势,相对于多的那么一点开销确实很划算,鱼和熊掌不可得兼,取舍在于开发者自己;
7)可以随时取消准备执行的任务(已经在执行的不能取消),GCD没法停止已经加入queue 的 block(虽然也能实现,但是需要很复杂的代码)
基于GCD简单高效,更强的执行能力,操作不太复杂的时候,优先选用GCD;而比较复杂的任务可以自己通过NSOperation实现.
4: App 启动优化策略?最好结合启动流程来说(main()函数的执行前后都分别说一下,知道多少说多少)
**减少不必要的framework;**
**清理项目中没有使用到的代码、类,避免冗余代码;**
**慎用+load,**第三方库已经使用了够多的+load方法(objection,rn…),在写代码时尽量用+initialize代替+load;
**梳理流程,优化代码,启动模块化。**耗时操作不要在主线程;
**本地缓存。**首页的数据离线化,优先展示本地缓存数据,等待网络数据返回之后更新缓存并展示;
**懒加载,使用时再去创建;**
** 网络优化,**减少接口请求,接口合并,使用ip直连,除去DNS解析耗时,使用protobuf协议,使用http2协议。
5: App 无痕埋点的思路了解么?你认为理想的无痕埋点系统应该具备哪些特点?(知道多少说多少)
方案大体上可以归为三类:
第一类是代码埋点,即在需要埋点的节点调用接口直接上传埋点数据,友盟、百度统计等第三方数据统计服务商大都采用这种方案;
第二类是可视化埋点,即通过可视化工具配置采集节点,在前端自动解析配置并上报埋点数据,从而实现所谓的“无痕埋点”, 代表方案是已经开源的Mixpanel;
第三类是“无埋点”,它并不是真正的不需要埋点,而是前端自动采集全部事件并上报埋点数据,在后端数据计算时过滤出有用数据,代表方案是国内的GrowingIO。
6: 你知道有哪些情况会导致app崩溃,分别可以用什么方法拦截并化解?(知道多少说多少)
导致app崩溃的原因有很多,比如向某个对象发送其无法响应的方法,数组越界,集合类中添加nil对象,string访问越界,KVO不合理的移除关联key(KVO导致的崩溃不仅仅这一种原因)等。
7: 你知道有哪些情况会导致app卡顿,分别可以用什么方法来避免?(知道多少说多少)
a:界面导致的卡顿 iOS 界面卡顿原因
b:线程导致的卡顿
网友评论