ios常见面试题

1.数据存储

1.如果后期需要增加数据库中的字段怎么实现,如果不适用CoreData呢?

  • 编写SQL语句来操作原来表中的字段
  • 1>增加表字段
    • ALTER TABLE 表名 ADD COLUMN 字段名 字段类型
  • 2>删除表字段
    • ALTER TABLE 表名 DROP COLUMN 字段名
  • 3> 修改表字段
    • ALTER TABLE 表名 RENAME COLUMN 旧字段名 TO 新字段名

2.SQLite数据存储是怎么用?

  • 1>添加SQLite动态库 

 

  • 2>导入主头文件:#import <sqlite3.h>
  • 3>利用C语言函数创建打开数据库,编写SQL语句

3.简单描述下客户端的缓存机制

  • 1、缓存可以分为:内存数据缓存、数据库缓存、文件缓存
  • 2、每次想获取数据的时候
    • 1、先检测内存中有无缓存
    • 2、再检测本地有无缓存(数据库文件)
    • 3、最终发送网络请求
    • 4、将服务器返回的网络数据进行缓存(内存、数据库、文件),以便下次读取

4.你实现过多线程的Core Data么?NSPersistentStoreCoordinator,NSManagedObjectContext和NSManagedObject中的那些需要在线程中创建或者传递?你是用什么样的策略来实现的?

  • 1、CoreData是对SQLite数据库的封装
  • 2、CoreData中的NSManagedObjectContext(单例)在多线程中不安全
  • 3、如果想要多线程访问CoreData的话,最好的方法是一个线程一个NSManagedObjectContext
  • 4、每个NSManagedObject对象实例都可以使用同一个NSPeristentStoreCoordinator前上锁。

2.客户端安全性和框架设计

1、客户端安全性处理方式?

  • 1、网络数据传输(敏感数据【账号密码消费数据银行卡账号】不能明文发送)
  • 2、协议的问题(自定义协议,游戏代练)
  • 3、本地文件存储(游戏的存档)
  • 4、源代码

2、sip是什么?

  • 1、sip(Session Initiation Protocol),会话发起协议
  • 2、sip是简历VOIP链接的IETF标准,IETF是全球互联网最具权威的技术标准化组织
  • 3、所谓VOIP,就是网络电话,直接用互联网打电话,不耗费手机话费。

3、有些图片加载的比较慢怎么处理?你是怎么优化程序的性能的?

  • 1、图片下载放到异步线程
  • 2、图片下载过程中使用占位图片
  • 3、如果图片较大,可以考虑多线程断点下载

4、你实现过一个框架或者库以供别人使用么?如果有,请谈谈构建框架或者库时候的经验,如果没有,请设想和设计框架的public的API,并指出大概需要如何做,需要注意一些什么方面来使别人容易地使用你的框架。

  • 1、提供给外界的接口功能是否实用、够用
  • 2、别人使用我的框架时,能否根据类名、方法名猜出具体功能和作用
  • 3、别人调用接口时,提供的参数是否够用、调用起来是否简单
  • 4、别人使用我的框架时,要不要再导入依赖的其他框架。

5、APP需要加载超大量的数据,给服务器发送请求,但是服务器卡住了如何解决?

  • 1、设置请求超时
  • 2、给用户提示请求超时
  • 3、根据用户操作再次请求数据

6、地图导航不能用了怎么办?

  • 提示用户打开导航定位功能

7、SDWebImage具体如何实现

  • 1、利用NSOperationQueue和NSOperation下载图片,还是用GCD的一些函数(解码GIF图片)
  • 2、利用URL作为key,NSOperation作为value
  • 3、利用URL作为key,UIImage作为value

8、AFN和ASI有什么区别

  • 1、AFN基于NSURL,ASI基于底层的CFNetwork框架,因此ASI的性能优于AFN
  • 2、AFN采用block的方式处理请求,ASI最初采取代理的方式处理请求,后面也增加了block的方式
  • 3、AFN值封装了一些常用功能,满足基本需求,直接忽略了很多扩展功能,比如没有封装同步请求;ASI提供的功能较多,预留了各种接口和工具供开发者自行扩展
  • 4、AFN直接解析服务器返回的JSON、XML等数据,而ASI比较原始,返回的是NSData二进制数据 

9、runloop定时源和输入源

  • 1、你创建的程序不需要显示的创建runloop;每个线程,包括程序的主线程(main thread)都有与之相应的runloop对象,主线程会自行创建并运行runloop
  • 2、runloop处理的输入时间有两种不同的来源:输入源(input source)和定时源(timer source)
  • 3、输入源传递异步消息,通常来自于其他线程或者程序。定时源则传递同步消息,在特定时间或者一定的时间间隔发生 

10、即时通讯中的大量数据处理

  • 用put上传到文件服务器,然后发带URL的自定义格式给对方,对方接受到之后下载

11、json解析的具体实现

  • 1、SBJson
  • 2、JSONKit
  • 3、NSJSONSerialization

12、如果在网络数据处理过程中,发现一处比较卡,一般怎么解决?

  • 1、检查网络请求操作是否被放在主线程
  • 2、异步请求的数量是否过多
  • 3、数据量是否太大?如果太大,先清除一些不必要的对象(看不见的数据、图像)
  • 4、手机CPU使用率和内存问题

13、怎么解决sqlite锁定的问题

  • 1、设置数据库锁定的处理函数

int sqlite3_busy_handler(sqlite3*,int(*)(void*,int),void*);

  • 2、设定锁定时的等待时间

int sqlite3_busy_timeout(sqlite3*,60);

14、KVO内部实现原理

  • 1、KVO是基于runtime机制实现的
  • 2、当某个类的对象第一次被观察时,系统就会在运行期动态地创建该类的一个派生类,在这个派生类中重写基类中任何被观察属性的setter方法。派生类在被重写的setter方法实现真正的通知机制(Person -> NSKVONotifying Person)

15、是否可以吧比较耗时的操作放在NSNotificationCenter中?

  • 如果在一部线程发的通知,那么可以执行比较耗时的操作
  • 如果在主线程发的通知,就不可以执行比较耗时的操作

16、Foundation对象与Core Foundation对象有什么区别?

  • 1、Foundation对象是OC的,Core Foundation对象是C对象
  • 2、数据类型之间可进行转换
    • ARC: bridge retained 、 _bridge transfer
    • MRC: _bridge

17、不用中间变量,用两种方法交换A和B的值

A = A + B
B = B - A
A = A - B
或者
A = A^B
B = A^B
A = A^B

3.多线程

1、列举Cocoa中常见对几种多线程的实现,并谈谈多线程安全的几种解决办法及多线程安全怎么控制?

  • 1、只在主线程属性访问UI
  • 2、如果要防止资源抢夺,得使用synchronized进行加锁保护
  • 3、如果异步操作要保证线程安全等问题,尽量使用GCD(有些函数默认就是安全的)

2、GCD内部怎么实现的

  • 1、ios和OS X的核心是UNIX内核,GCD是基于UNIX内核实现的
  • 2、GTCD的API全部在libdispatch库中
  • 3、GCD的底层实现主要有Dispatch Queue 和Dispatch Source
    • Dispatch Queue:管理block操作
    • Dispatch Source:处理事件

3、你用过NSOperationQueue么?如果用过或者了解的话,你为什么要使用NSOperationQueue,实现了什么?请描述它和GCD的区别和类的地方(提示:可以从两者的实现机制和范围来描述)。

  • 1、GCD是纯C语言的API,NSOperationQueue是基于GCD的OC版本封装
  • 2、GCD只支持FIFO的队列,NSOperationQueue可以很方便地调整执行顺序、设置最大并发数量
  • 3、NSOperataionQueue可以轻松的在Operatrion设置依赖关系,而GCD需要些很多代码才能实现
  • 4、NSOperationQueue支持KVO,可以检测opertaion是否正在执行(isExecuted)、是否结束(isFinished),是否取消(isCanceld)
  • 5、CGD的执行速度比NSOperationQueue快
  • 任务之间不太互相依赖:CGD
  • 任务之间有依赖或者要监听任务的执行情况:NSOperationQueue

4、既然提到CGD,那么问一下在使用GCD以及block时要注意些什么?他们两是一回事吗?block在ARC中和传统MRC中的行为和用法有什么区别,需要注意些什么?

  • block的使用注意
    • 1、block的内存管理
    • 2、防止循环retain
      • MRC:__block
      • ARC:__weak__unsafe_unretained

5、在一部线程中下载很多图片,如果失败了,该如何处理?请结合Runloop来谈谈解决方法(提示:在异步线程中启动一个runloop重新发送网络请求,下载图片)

  • 1、重新下载图片
  • 2、下载王弼,利用runloop的输入源回到主线程属性UIImageView
原文地址:https://www.cnblogs.com/sleepingSun/p/5622933.html