客户端安全性处理方式:
1. 网络数据传输:
发数据(敏感数据-账号.密码.消费数据.银行卡账号)的时候不能明文发送--MD5加密
防止被黑客或代理服务器
2. 协议的问题
http 的get post
自己公司写一个协议
3. 本地文件存储
游戏的存档也要加密,防止越狱的手机查看本地文件
4. 源代码
archive打包后的程序ipa 或者是 沙盒中的.o 二进制exec的文件
.m -> 编译.o 文件
反编译工具 - 全部是运行时代码
混淆:(将源代码搞乱)
手动混淆:发布前将自己将类名方法名变量名全部改掉
工具混淆:将C/OC代码混淆的工具
sip是什么
1. sip 会话发起协议
2. voip (网络电话) 是基于sip的,直接用互联网打电话,不用耗手机话费
有些图片加载比较慢怎么处理?
1. 图片下载放在异步线程
2. 图片下载过程中使用占位图片
3. 如果图片过大,可以考虑多线程断点下载 -> 设置请求头信息
你实现过一个框架吗?
1. 提供给外界的借口是否够实用,是否够用
2. 别人使用我的框架时能不能根据类名,方法名就能猜出接口的具体作用
3. 别人调用接口时,提供的参数是否够用,调用起来是否简单
4. 别人调用我的框架时,要不要导入其他依赖的框架
APP发送超大量的数据,给服务器发送请求,但服务器卡住了如何解决?
1. 设置请求超时
2. 给用户提示请求超时
3. 根据用户操作再次请求数据 (不要主动再发送请求)
利用NSNotificationCenter实现跨多控制器传输数据和消息中用异步还是同步?
1. 如果通知是在主线程发出,那么接收通知的方法中的耗时操作要放到异步线程中
[[NSNotificationCenter defaultCenter] postNotificationName: @"abc" object; nil ];
[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(test) name: @"abc" object : nil];
- (void) test { dispatch.....}
2. 如果通知实在异步线程中发出,那么接收通知后调用的方法会默认在异步线程中执行
dispatch_async ( dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),^{
[NSNotificationCenter defaultCenter] postNotificationName: @"abc" object; nil ];
});
[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(test) name: @"abc" object : nil];
- (void) test {}
地图导航不能用怎么办?
1. 提示用户打开导航功能->请用户在设置中打开
SDWebImage具体实现过程
1. 利用NSOperationQueue 和 NSOperation 下载图片
2. 还使用GCD的一些函数来解码GIF图片
gif图片 (gif分解)->imageIO 切除所有帧 (每一帧都是UIImage对象)(这个过程比较耗时,放入异步线程中)
UIImageView * imageView;
imageView.animationImages = ..;
3. 利用URL作为key, NSOperation 作为 value
4. 利用URL作为key, UIImage 作为 value
AFN 和 ASI 有什么区别
0. ASI 是http的终结者,性能比较好,不过没人维护
1. AFN 基于 NSURL, ASI 基于底层的CFNetwork框架, 因此ASI的性能优于AFN
2. AFN 采取 Block 方法处理请求, ASI 最初采取delegate的方式来处理请求, 后来也增加了 Block 的方式
3. AFN 只是封装了一些常用的功能, 满足基本的需求, 直接忽略了很多扩展功能,比如没有封装同步请求;
ASI 提供的功能较多,预留了各种接口和工具供开发者自行扩展
4. AFN 直接解析服务器返回的JSON, XML 等数据, 而 ASI 比较原始, 返回的是NSData 二进制数据
在实际开发中,有哪么手机架构和性能调试经验?
UI层
业务层(处理业务逻辑)
工具层(处理业务手段, 网络, 存储)
1. 刚接手公司的就项目时, 模块特别多, 而且几乎所有的嗲吗都写在控制器里面,比如UI控件代码, 网络请求代码, 数据存储代码
2. 接下来采取MVC的模式进行封装, 重构
自定义UI控件封装内部的业务逻辑
封装网络请求的工具类
封装数据存储的工具类
runloop
主线程 的 Runloop对象 会自动开启, UIApplication开启了一个死循环(消息循环)
每一个线程都有自己的 runloop 对象
runloop 1.> 输入源 input resource: (异步消息->处理其他线程)处理处理其他线程回到主线程做事情
performSelector: onThread (线程之间通信)
2.> 定时源 timer resource :(同步消息->处理主线程) 处理主线程的UI界面刷新,事件处理,定时器(定时解决界面上有没有UI刷新,滚动)
你们项目中都用了哪些框架,及何种开发工具,具体到哪个版本?
1. AFN . SDWebImage . MBProgressHUD 等 (搜索 : 网易新闻 第三方库)
自己怎么实现原子锁?(不建议)
atomic : 调用set 和 get 方法时都要加一把锁 ,用
- (void) setAge:(NSInteger) age{
@synchronized(self){
_ age = age;}
}
UI控件在主线程中,不存在资源抢夺的问题,一般用 nonatomic.
即时通讯中大数据怎么处理?(聊天)
TCP/IP , 压缩文件再上传
把大文件https的put上传到文件服务器,再通过上传后的url 路径来下载文件
json 的解析?
1. SBJson
2. JSONKit
3. NSJSONSerialization
如果在网络数据处理过程中,发现一处比较卡,一般怎么解决?
开子线程特别耗费内存资源,所以需要对线程进行精准的管理
1. 检查网络请求是否放在了主线程中
2. 看看异步请求的数量是否太多了(子线程数量)
3. 数据量是否太大? 如果太大,先清除一些不必要的对象(看不见的数据, 特别是图片)
及时监听内存警告
- (void) ApplicationDidReceiveMesonry
4. 手机CPU 使用率和内存问题
怎么介绍一个项目?
1. 项目的价值
2. 项目的模块
3. 我做的是哪个模块
多线程安全怎么控制?
1. 只在主线程中刷新访问UI
2. 如果要防止资源抢夺, 得用 synchronized 进行加锁保护
3. 如果异步操作要保证线程安全问题, 尽量使用GCD (有些函数默认是线程安全的)
异步线程中下载很多图片,如果失败了,如何处理?
1. 重新下载图片
2. 下载完毕后,利用Runloop 的 输入源回到主线程刷新UIImageView
autolayout?
屏幕适配,横竖屏都可以用.没有了坐标的概念
socket?
AsyncSocket框架
简单描述客户端的缓存机制?
1. 缓存可以分为: 内存数据缓存, 数据库缓存, 文件缓存
2. 每次想获得数据的时候
<1>. 先检测内存中有无缓存
<2>. 再检测本地有无缓存(数据库/文件)
<3>. 最终发送网络请求
<4>. 将服务器返回的网络数据进行缓存(内存, 数据库, 文件), 以便下次读取.
CoreData是对SQLite数据库的封装.
CoreData.Framework 是OC 版的.性能不好.封装了一些不需要的SQL语句
1. NSManagedObject: 实体对象(1个类对应1张表,1个对象对应表中的1条记录)
2. NSManagedObjectContext: 存储器, 决定了你的数据存储在什么地方(SQLiteXML其他文件)
3. NSPersistentStoreCoordinator: 操作数据库
4. CoreData 中的NSManagedObjectContext 在多线程中不安全
5. 如果想要多线程访问 CoreData 的话,最好的方法是一个线程一个NSManagedObjectContext
6. 每个NSManagedObjectContext 对象实例都可以使用同一个NSPersistentStoreCoordinator,这是因为NSManagedObjectContext会在使用NSPersistentStoreCoordinator前上锁.
SQLite 是C语言编写的.性能比较好.
GCD内部怎么实现的??
1. GCD 的XNU的内核实现的,iOS 和 OSX的核心是XNU内核
2. GCD 的API 全部在libdispatch.lib库中.
3. GCD 的底层实现主要有dispatch queue (管理Block操作)和 dispatch source(处理事件,比如线程之间的通讯)
任务之间不太依赖的用GCD
任务之间有依赖,或者要监听任务的执行情况用NSOperation