网络通讯中加密方式有哪些,各自原理?
- md5(哈希算法):把任意长度的字符串加密成一个128bit的大整数,并且是不可逆的。每次固定字符加密出来的密文都相同。如果只是一个"123"字符串,使用MD5加密
- RSA(非对称算法加密):产生一对非对称的公钥和私钥,公钥加密,私钥解密。私钥加密,公钥解密。
- AES(对称加密):加密和解密的密钥都是同一个
- base64(现代密码学基础):(编码方案Base 64)原本8bit一组的数据改成6bit一组,不足的地方补0,每两个0用一个=表示
谈下开发中iOS缓存的理解
缓存主要针对展示UI层数据。比如个人资料界面。
- 网络优化:开始总是从网络获取,如果获取失败,从本地获取(旧数据)
- 本地优先:在一段时间内从本地获取,当超过这个时间,然后重新请求网络数据(展示同时覆盖旧数据)
- 混合:打开App先从本地获取展示,然后请求数据,请求完成后刷新界面。
你认为开发哪些导致crash?
当App闪退时,操作系统会生成一个crash日志,保存在设备上。crash日志上有用的信息,比如每个正在执行线程的完整堆栈信息和内存映像,这样就能够通过,分析这些信息来定位crash发生时的代码逻辑,最终找到App闪退的原因。
crash主要有两种原因:违反iOS系统规则导致的crash
、App代码逻辑Bug导致的crash
1.代码逻辑的Bug
- SEGV:(Segmentation Violation,段违例)。无效的内存地址,如:空指针,未初始化指针,栈溢出等
- SIGABRT:收到Abort信号,可能自身调用abort()或者收到外部发送过来的信号。
- SIGBUS:总线错误。访问的是有效地址,但总线访问异常,地址对齐问题。
- SIGILL:尝试执行非法的指令,可能不被识别或者没有权限
- SIGFPE:Floating Point Error。数学计算相关问题。不限于浮点计算,例如除零操作
- SIGPIPE:管道另一端没有进程接手数据;常见的崩溃原因基本都是代码逻辑问题,或资源问题,比如数组越界,访问野指针或资源不存在,或资源大小写错误等。
2.违反iOS系统规则的Bug
-
内存报警闪退
- 当iOS检测到内存过低时,系统就会发出低内存警告的通知,尝试回收一些内存。如果没有得到改善,iOS会终止后台应用老回收更多内存。最后,如果还是内存不足,那么正在运行的程序也会被终止掉。在
Debug
模式下,可以主动将客户端执行的动作逻辑写入一个日志文件中,这样可以将内存预警逻辑写入日志文件,当发送内存报警时,就提醒当前客户端性能内存不足,可以通过Instruments
工具中的Leasks
和Allocations
模块库来发现内存泄露问题和内存分配问题。
- 当iOS检测到内存过低时,系统就会发出低内存警告的通知,尝试回收一些内存。如果没有得到改善,iOS会终止后台应用老回收更多内存。最后,如果还是内存不足,那么正在运行的程序也会被终止掉。在
-
响应超时
- 当App对一些特定的事件(比如启动、挂起、恢复、结束)响应不及时,苹果的Watchdog机制会把应用程序干掉,并生成一份相应的crash日志。
-
用户强制退出
- 双击home键,关闭App,这种场景不会产生crash日志,这是所有的App都处于后台状态,而iOS随时可能关闭后台进程,当App阻塞界面并停止响应时,这种场景才会产生crash日志。
- 比如:复杂的操作:先按住电源键,直到出现”“滑动关机”的界面时,再按住home键。这时候当前的App会被终止掉,并且产生一份相应事件的crash日志。
3.使用过KVO吗?
- KVO是OC对观察者设计模式的一种实现。[通知机制]
- KVO:键值监听 提供一种机制,指定一个被观察对象(例如A类),当对象某个属性(例如A中的字符串name)发生更改时,对象会获得通知,并作出相应处理。而且不需要给观察的对象添加任何额外代码,就能使用KVO机制了。
- 基本原理:KVO的实现依赖于OC强大的Runtime。当观察某对象A时,KVO机制动态创建一个对象A当前类的子类,并为这个子类重写了被观察属性keyPath的Setter方法。Setter方法随后负责通知观察对象属性的改变状况。
- KVO 优点:
1.能够提供简单的方法实现两个对象的同步
2.能够对内部对象的状态作出相应,而且不需要改变内部对象的实现
3.能够提供被观察者属性的最新值和之前的值
4.完成对观察对象的抽象,不需要额外的代码来允许观察者被观察
- KVO缺点:
1.观察的属性必须要用字符串定义,编译时不会出现警告
2.对属性重构,修改了一个被观察类的某些属性,但是监听代码没有对应修改,将导致观察代码不可用
3.复杂的"if"语句,要求对象正在观察多个值,因为所有的观察代码通过一个方法来指向
4.当释放观察者的时候不需要移除观察者
- KVC:键盘编码,是key value coding的简称,是一种可以直接通过字符串名字Key 来访问类属性的机制,而不是通过调用getter setter方法来进行访问
KVC优点:主要好用减少代码量,没有property变量也能通过KVC进行设置
KVC缺点:key写错时,编译的时候不会保持,运行时会报错
如何对iOS设备进行性能测试?
- Instruments 是应用程序用来动态跟踪和分析 Mac OS X 和 iOS 代码的实用工具。这是一个灵活而强大的工具,它让你可以跟踪一个或多个进程,并检查收集的数据。
使用CocoPods吗?它是什么?CocoaPods原理
- CocoaPods 一个第三方库依赖的管理工具,可用来帮助导入、配置以及更新所用的第三方。
- CocoaPods 原理
将所有的依赖库都放到另一个名为Pods的项目中,然后让主项目依赖Pods项目
- 源代码管理工作任务从主项目移到了Pods项目中
- CocoaPods通过一个名为Pods.xcconfig的文件在编译设置所有的依赖和参数
- Pods项目最终会编译成一个名为libPods.a的文件,主项目只要依赖这个.a文件就可以了
- 对于资源文件,CocoaPods提供了一个名为Pods-resource.sh的bash脚本,在每次项目编译的时候都会执行,将第三方库的各种资源文件复制到目标目录中
集成第三方框架有哪些方法?
- 手动集成。直接下载源码拖进项目用
- CocoaPods集成。使用编辑podfile文件,然后pod install
- framework。SangforSDK.a静态库的集成 xxxx.framework
- Carthage集成。与CocoaPods不同的机制。会生成一个xxx.framework,然后将其拖到项目中。
crash的收集和定位bug的方式谈下
- iTunes Connect(Manage Your Applications - View Details - Crash Reports),但是前提用户设置->隐私->诊断与用量->诊断与用量数据开启.一般不推荐
- 自己实现应用内崩溃收集,并上传服务器.eg:aWork异常调试提交(收集异常,存储到本地,下次用户打开程序时上传给我们)
- 在程序启动时加上一个异常捕获监听,用来处理程序崩溃时的回调动作UncaughtExceptionHandler是一个函数指针,该函数需要我们实现,可以取自己想要的名字。当程序发生异常崩溃时,该函数会得到调用,这跟C,C++中的回调函数的概念是一样的。
NSSetUncaughtExceptionHandler (&UncaughtExceptionHandler)。 程序启动代理方法
//:collection crash info by Mili
void UncaughtExceptionHandler(NSException *exception) { NSArray *callStack = [exception callStackSymbols];
NSString *reason = [exception reason];
NSString *name = [exception name];
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"YYYY-MM-dd HH:mm:ss"];
NSString * dateStr = [formatter stringFromDate:[NSDate date]];
NSString * iOS_Version = [[UIDevice currentDevice] systemVersion];
NSString * PhoneSize = NSStringFromCGSize([[UIScreen mainScreen] bounds].size);
NSString * App_Version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
NSString * iPhoneType = @"当前设备名字";
NSString *uploadString = @"所有拼接信息";
// 存储到本地沙盒.下次启动找寻
- 第三方收集crash (比如说集成友盟,使用dSYM分析定位代码)