iOS 面试

客户端安全性处理方式:

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: 存储器, 决定了你的数据存储在什么地方(SQLite\XML\其他文件)

  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

 

posted @ 2016-01-07 19:44  aunty_m  阅读(232)  评论(0编辑  收藏  举报