题目1、举例两个遇到过印象深刻的外网Crash,并介绍如何发现、定位、解决;
主要根据自身经验来回答,个人经验:
①在debug运行正常,但在打包出来就会发生crash崩溃!
测试提了一个必现的crash,自己运行代码发现复现不了这个问题,但自己测试发现确实打出来的包会发生crash,开始以为是打包出现了问题或者是测试版本的问题,但发现不是,后来在通过项目跑relese环境并且打开僵尸断点定位到时model赋值时发生了崩溃
原因: relese环境会对代码一定进行优化,relese默认会使用[-Os]对源码优化,debug是默认的[-O0]不对源码进行修改
最后一点点排查发现是Nsstring用了assign修饰符,改为copy即修复了bug
②在循环里有判断赋值,但最后的数值和预期的不服
场景: 在for循环里写判断赋值
首先断点发现赋值的代码只走过一次,那为什么最后值又发生了改变呢,明明赋值代码只走了一次,最后发现是浅拷贝造成值发生了改变,我用self.model去接收model的值,因为我的model只初始化一次,并不是每次循环都初始化,但model的值随着每次遍历改变,所以self.model和model是浅拷贝的关系,导致了明明赋值代码只走一次但是值却不停改变,最后通过在循环内部初始化解决了,也可以使用[model copy]
方式
③提测日出现crash崩溃
周六提测日出现了crash,是其他同事负责的模块,通过全局断点也断不到位置,当时是比较慌的,因为马上上线了,之后根据代码一点点找到原因,最后发现是tableView的cell返回nil导致的,因为这个VC对应的cell很多种类型,生成cell的方式就通过一个工厂模式的方法去实现,对应方式也是根据cell名,但因为有修改导致cell名对应不上,返回了nil的cell导致的崩溃,最后改了对应信息并且加了空值的保护
题目2、举例两个性能问题的优化,并介绍如何发现、定位、解决以及原理;
主要根据自身经验来回答,个人经验:
①GCD group解决网络请求问题
发现代码里2个顺序执行的网络请求,但其实两个请求并没有顺序关系,所以使用GCD的dispatch_group及enter和leave实现两个网络请求的异步并发请求,在2个接口数据都请求完成后,再回到主线程更新UI
②问题: NSTimer存在定时不准确问题
项目里存在定时器功能,但定时器因为受到runloop影响,可能存在定时不准的情况,使用GCD带的定时器完成定时功能,避免了安全隐患
题目3、介绍Objective-C的Runtime机制,并介绍在业务实际应用的例子;
oc动态性, 运行时将代码转化为runtime的C代码
生成对应objc_msgSend方法 isa指针查看当前类有没有这个方法, 之后寻找父类, 每个方法SEL(方法选择器)对应IMP(类似于一个编号,是函数指针,指向函数实现,找到内存里对应函数), 直到NSObeject, 如果找不到IMP, 会进入消息转发机制, resolveClassMethod, resolveInstanceMethod, forwardingTargetForSelector, forwardInvocation 第一个方法所属类方法动态方法解析, 第二个和第一个类似,是对应实例方法的, 第三个是备援接受者, 第四个方法是消息重定向, 真正消息转发,也是Aspects的核心操作, 如果都找不到调用doesNotRecognizeSelector:方法抛出异常
题目4、苹果是如何保证iPhone只安装来自App Store的App?
应用签名(双向认证原理),通过证书,app打包时需要把证书也打包进去,苹果会通过证书在线判断APP是否合法
题目5、你的App如何同后台进行通信?其通信过程包括哪些步骤;
HTTP 定义了与服务器交互的不同方法,最常用的有4种,Get、Post、Put、Delete
1)Get, 它用于获取信息,注意,他只是获取、查询数据,也就是说它不会修改服务器上的数据,从这点来讲,它是数据安全的,而稍后会提到的Post它是可以修改数据的,所以这也是两者差别之一了。
2)Post,它是可以向服务器发送修改请求,从而修改服务器的,比方说,我们要在论坛上回贴、在博客上评论,这就要用到Post了,当然它也是可以仅仅获取数据的。
3)Delete 删除数据。也可以通过Get/Post来实现。
4)Put,增加、修改数据,也可以通过Get/Post来实现。
区别和联系:
1)Get请求的数据是放在HTTP包头中的,也就是URL之后,通常是像下面这样定义格式的,(而Post是把提交的数据放在HTTP正文中的)。
login.action?name=hyddd&password=idontknow&verify=%E4%BD%E5%A5%BD
a,以?来分隔URL和数据;
b,以&来分隔参数;
c,如果数据是英文或数字,原样发送;
d,如果数据是中文或其它字符,则进行BASE64编码。
2)GET提交的数据比较少,最多1024B,因为GET数据是附在URL之后的,而URL则会受到不同环境的限制的,比如说IE对其限制为2K+35,而POST可以传送更多的数据(理论上是没有限制的,但一般也会受不同的环境,如浏览器、操作系统、服务器处理能力等限制,IIS4可支持80KB,IIS5可支持100KB)。
3)Post的安全性要比Get高,因为Get时,参数数据是明文传输的,而且使用GET的话,还可能造成Cross-site request forgery攻击。而POST数据则可以加密的,但GET的速度可能会快些。
题目6、视觉控制器的生命周期
生命周期.png题目7、 数据库
SQLite3、FMDB、CoreDate
网友评论