---关于iOS的一些面试试题---持续更新---答案有的没写自己去查资料

1.iOS内存的几大区域
  1.栈区由编译器自动分配并释放,存放函数的参数值,局部变量等。栈是系统数据结构对应的线程继承是唯一的,优点是快速高效,缺点是有限制,数据不灵活,具体在栈是先进后出,栈区分为静态区和动态区如:auto,alloca
  2.堆区是由程序员分配和释放的如果程序员不释放程序结束可能会由系统回收,如iOS中的alloc存储在堆中,优点是灵活方便
  3.全局静态区
  4.文字常量区
  5.代码区,存放二进制函数
 使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自由度小。
 使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大。
2.组件化解藕
  实现代码的高内聚,低耦合
3.runtime通过selector找到对应的imp地址,类对象中有类方法和实例话方法, 
记录着方法的名词,参数和实现,而selector本质就是方法名称,runtime通过这个方法名称就可以在列表中找到对应的方法,在寻找imp地址时,runtime提供了两种方法getMethod 和getImp

4.runloop内部实现逻辑:官方文档中给出的大致,1.通知observer即将进入runloop,2,通知observer将要处理timer3,通知observer将要处理soruce4,处理source。。6,通知observer线程将要休眠,7休眠等待唤醒,8通知observer线程被唤醒,然后重复,另外app启动后runloop注册了5个model,有一个app默认的model,有一个会用到,uitrackingrunloopmode,scroll滑动时保证不受其他mode影响,

5.多线程:
  1.pthread:一套通用的多线程api,适应unix,windows以及linux系统跨平台,以及可移植,难度大,使用c语言,几乎不用,生命周期由程序员进行管理
  2.nsthread:使用更加面向对象,简单易用,可直接操作线程对象,使用oc语言,偶尔使用,生命周期是有程序员进行管理,
  3.gcd,用来代替nsthread的充分利用了设备多核,使用c语言,经常食用,线程生命周期自动管理,
  4.nsoperation:基于gcd比gcd多了一些更简单的功能,经常用,自动管理
  多线程原理:同一时间cpu只能处理一条线程,只有一条线程在工作,
  多线程,并发同时执行,其实cpu款素的再多条线程之间调度
  如果cpu调度线程的时间足够快,就造成了多线程并发执行的假象,
  如果线程非常多的话,cpu在n多线程之间调度,cpu会累死,消耗大量的cpu资源
  每条线程被调度执行的频次会降低多线程执行效率降低
  多线程的优点:能适当的提高程序的执行效率,能适当的提高资源的利用率
  多线程的缺点:开启线程需要占用一定的内存空间,主线程大概是1M,子线程512kb,如果开启大量的线程,会占用大量的内存空间,降低程序的性能
  线程越多cpy在调度线程上的开销就越大
  更倾向于gcd,首先技术层次上讲,是轻量级的,通过gcd和block实现多线程,有时gcd相比其他系统提供的多线程更加有效,
  NSOPerationQueue 将后台的线程以队列的方式依序执行,
  Operation Queue的底层实现都是以GCD来实现的
  区别:1.    GCD是底层的C语言构成的API,而NSOperationQueue及相关对象是Objc的对象。在GCD中,在队列中执行的是由block构成的任务,这是一个轻量级的数据结构;而Operation作为一个对象,为我们提供了更多的选择;
  2.    在NSOperationQueue中,我们可以随时取消已经设定要准备执行的任务(当然,已经开始的任务就无法阻止了),而GCD没法停止已经加入queue的block(其实是有的,但需要许多复杂的代码);
  3.    NSOperation能够方便地设置依赖关系,我们可以让一个Operation依赖于另一个Operation,这样的话尽管两个Operation处于同一个并行队列中,但前者会直到后者执行完毕后再执行;
  4.    我们能将KVO应用在NSOperation中,可以监听一个Operation是否完成或取消,这样子能比GCD更加有效地掌控我们执行的后台任务;
  5.    在NSOperation中,我们能够设置NSOperation的priority优先级,能够使同一个并行队列中的任务区分先后地执行,而在GCD中,我们只能区分不同任务队列的优先级,如果要区分block任务的优先级,也需要大量的复杂代码;
  6.    我们能够对NSOperation进行继承,在这之上添加成员变量与成员方法,提高整个代码的复用度,这比简单地将block任务排入执行队列更有自由度,能够在其之上添加更多自定制的功能。 1,NSOperation拥有更多的函数可用,具体查看api。NSOperationQueue 是在GCD基础上实现的,只不过是GCD更高一层的抽象。

2,在NSOperationQueue中,可以建立各个NSOperation之间的依赖关系。

3,NSOperationQueue支持KVO。可以监测operation是否正在执行(isExecuted)、是否结束(isFinished),是否取消(isCanceld)

4,GCD 只支持FIFO 的队列,而NSOperationQueue可以调整队列的执行顺序(通过调整权重)。NSOperationQueue可以方便的管理并发、NSOperation之间的优先级。

使用NSOperation的情况:各个操作之间有依赖关系、操作需要取消暂停、并发管理、控制操作之间优先级,限制同时能执行的线程数量.让线程在某时刻停止/继续等。

使用GCD的情况:一般的需求很简单的多线程操作,用GCD都可以了,简单高效。

从编程原则来说,一般我们需要尽可能的使用高等级、封装完美的API,在必须时才使用底层API。

当需求简单,简洁的GCD或许是个更好的选择,而Operation queue 为我们提供能更多的选择。

GCD执行原理
gcd有一个底层线程池,这个池中存放的是一个个线程,之所以称为池,很容易理解这个池中的线程是可以重用的,当一段时间后这个线程没有被调用的话



5.防止被人反编译你的app
 1.本地数据加密(nsuserdefault,sqlite加密,关键信息以及账号加密)
 2.url编码加密,防止url被静态分析
 3.网络传输数据加密
 4.方法体和方法名的高级混淆
 5.借助第三方app加固,网银云盾等



6.优化性能

 1.iOS省电:方面优化
   CPU处理:
   Networking:
   Location:
   Graphics:

 2.关于切换圆角影响性能的问题
  .layer.cornerRadius并不会影响,真正影响的是.layer.masksToBounds
 3.对UIView的绘制理解
  1.view的渲染机制和runloop的关系
  2.列表卡顿造成的原因
  3.drawrect调用
  4.view的绘制和CPU、GPU、之间的关系
  5.切圆角都会浪费性能嘛
  6.离屏渲染
  7.优化cup与gpu的使用率
 4.保持界面流畅的理解

   界面流畅主要受CPU和GPU的影响,因此需要对CPU和GPU进行评估, 
   CPU:消耗资源的原因,对象创建分配内存,调升属性,以及读取文件等操作
        解决方案,再不需要触摸事件的控件使用CALayer显示比较合适
        布局变化大的界面减少使用storyboard
        推迟对象的创建时间,把对象的创建分散到多个任务去,如果对象可以复用尽量使用复用
        对象调整,UIView关于显示的相关属性,实际上都是CALayer的属性,映射来的,因此对UIView属性调整大于一般属性
        对象的销毁:大量对象销毁 时,其销毁时的资源消耗比较明显,如果可以放到后台去释放,尽量放到后台,首先捕获到对象,然后扔到后台
        布局计算:计算大量布局也会消耗CPU资源,后台提前计算好视图布局,并且提前对视图布局进行缓存,在需要时一次调整好对应属性,而不需要多次,频繁进行调整
        文本计算:boundingRectWithSize:
        文本渲染:屏幕上看到的空间,排版绘制放在主线程进行,自定义文本空间,用CoreText异步绘制
        图片解码:全部放倒后台处理
        图像绘制:全部放倒后台处理
    GPU:纹理渲染 所有的bitmap 包括图片 文本  栅格化内容,最终都要由内存提交到显存,绑定为GPU
         不论是提交到显存还是GPU调整和渲染都要消耗GPU
         如果在较短时间显示大量图片时,CPU占用率很低,GPU占用率比较高,界面会掉帧
         2.当图片过大,超过GPU,最大纹理尺寸,图片需要先由GPU进行预处理,这样对CPU和GPU都会带来额外的资源消耗

         尽量在短时间内大量的图片显示,尽可能的将多张图片合成一张显示
         4S 以上机型,纹理尺寸上限都是 4096x4096. 尽量不要超过这个
    视图混合 :消耗原因,多个视图重叠在一起显示,GPU会首先把它们混合到一起,如果视图结构过于复杂,混合的过程中也会消耗很多GPU资源,
    应当尽量减少视图数量和层次

    图形生成:消耗因,CAL原ayer的border 圆角 阴影 遮罩 CASharepLayer的矢量图形显示,通常会触发离屏渲染,离屏渲染通昌发生在GPU中
    解决方案:把需要显示的图形在后台线程绘制为图片,避免使用圆角,阴影,遮罩等属性

 5.相册,保存图片时,保存到相册的是什么

 6.关于字符串混淆方法名的问题,类名
  字符串加密:考虑哪些可以加密哪些不可以加密
  类名方法名混淆 使用随机的字符串替换类名以及方法名
  程序代码混淆
 
 7.App包的大小受哪些影响
 
   图片 
   资源文件

 8.iPhone自带的AssistiveTouch你如何实现



 9.关于debug和release
   debug:用于调试,debug模式下会启动比较多的服务来监督错误,因此运行速度比较慢切比较耗能
   release:发布版本,使用过程会去掉繁琐的监控服务运行速度相对较快,比较节约内存



 10.socket异常断开时,设计一个合理的重连机制。

 11.tcp为什么要进行三次握手?不是2次,4次?

  tcp是可靠的传输协议,是靠seq确认完成的,因此建立在一个可靠的单项通道至少需要一次,三次握手主要目的是为了防止已失效的连接请求报文突然又传到了服务端,因而产生的错误

  
 12.抓包工具的原理是啥

 13.tcp是基于流式传输的,怎么设计协议,进行协议的解析?

 14.http为什么底层是tcp不是udp ?

 15.http协议

 16.写二叉树的先序遍历,然后用非递归写

 17.iOS中的NSCopying协议,copy,MutableCopy的区别

 18.堆和栈的区别,工程项目中的哪些数据是储存在堆哪些在栈中

 19.iOS开发中用过哪些测试性能的工具

 20.instruments它为什么能检测内存泄漏

 21.cocoaPods的实现思路,为什么没有使用cocoaPods管理自己的SDK

 22.项目中如何保证数据的安全性

 23.一个页面可以由几个控制器共同管理吗

7.算方方面:
  1.快速排序:
  1.冒泡排序
  2.堆排序
  3.归并排序
  4.二分查找
  5.线性查找
  6.深度优先搜索
  7.广度优先搜索
  8.Dijkstra算法
  9.动态规划算法
  10.朴素贝叶斯分类算法

8.+initialize 与 +load

9.说说你理解的无痕埋点

10.项目中网络层如何做安全处理?

11.main()之前的过程有哪些?

12.消息转发机制原理?

13.说说你理解weak属性?

14.KVO实现原理?

   key value observe 观察  实现都是基于runtime 当一个对象被第一次观察时,会生成一个派生类,派生类重写基于基类的setter 实现真正的通知
   主要依赖两个方法,willchangevalueforkey  didchangevalueforkey 一个记录旧数据,kvo的实现机制实际是重写了class,而并非是当前类

   kvc:
   主要是通过交换两个对象的isa指针,首先观察有没有setter 其次观察 _property 寻找成员属性

15.假如Controller太臃肿,如何优化
//https://www.jianshu.com/p/3a50d1805655?utm_campaign=maleskine&utm_content=note&utm_medium=pc_all_hots&utm_source=recommendation
16.OC你了解的锁有哪些 。自旋和互斥对比

17.内存泄漏可能会出现的几种原因,聊聊你的看法

18.容错处理你们一般是注意哪些?

19.项目开始容错处理没做?如何防止拦截潜在的崩溃?

20.编译过程做了哪些事情;
 C++ Objective-C都是编译语言,必须先通过编译器生成机器码,机器码可以直接在CPU上执行,所以执行效率高
 Objective-C编译依赖CLang+LLVM,其中CLang作为前端,LLVM作为后端
 编译前端的任务:语法分析 语义分析 生成中间代码,这个过程中会进行类型检查,如果出现错误或者警告会标注出错误
 编译后端会进行机器无关的代码优化,生成机器语言并且进行机器相关的代码优化



21.字典大致实现原理;

hash的key与value映射

22.block和函数指针的理解;

函数指针和block都可以实现回调操作,声明也相似实现上都是代码片段

函数指针类型和block类型都可以作为变量和函数参数的类型

不同之处在于 函数指针只能指向预先定义好的函数代码块,函数地址则是在编译链接时就已经确定好的

Block本质是Objective-C对象,可以接收消息,函数里面智能访问全局变量,而block代码块不光能访问全局变量还拥有当前栈内
和堆内存变量的可读性

23.一般开始做一个项目,你的架构是如何思考的?

24.你了解的UIKit结构?

25.你了解的OC函数调用原理

26._objc_msgForward直接调用它,会发生什么?

27.App启动的大致过程,能不能详细介绍下?

28.程序启动时,如何进行启动优化,提高用户体验?

29.OC对象如何进行内存布局?

30.优化你是从哪几方面着手?

31.讲述下ARC原理,讲述下KVO原理,讲述下RGB在16位,32位下各颜色占的位数

32.transform的原理

33.讲下信号变换的原理

34.讲述下HTTPS,讲述下http滑动窗口的作用

35./数据库中事务的问题/有实际用过吗/讲述下你们项目如何解耦的

36.JLRoutes的原理是啥,图片格式有几种,JPG格式为啥可以压缩/霍尔夫编码干啥的/

37.APP很卡顿,如何优化

38.APNs
工作原理:首先应用程序会将需要发送的消息和设备令牌(deviceToken)打包发给APNs
        APNs会在自己已经注册的iPhone列表中根据设备令牌查找目标iPhone然后将消息发给目标iPhone
        iPhone将消息发送给应用程序并且设定方式弹出

39.呵呵,写这个有意思?
+ (instancetype)sharemanager
{
  nsobject *object = nil;
  static dispatch_once_token onceToken;
  dispatch_once(&onceToken,^{
    object = [[nsobject alloc]init];
  });
  reture object;
}

40.KVO实现原理
   KVO是基于runtime机制实现的
   当某个类的属性对象第一次被观察时,系统就会在运行期动态的创建该类的一个派生类,在这个派生类中重写基类中
   任何被观察属性的setter

41.项目网络层如何做安全处理

42.  Category和原方法重名时,会先调用谁的方法?原理是什么?多个Category 都有重名方法时是否可以手动指定调用顺序?

      BuildPhases Compile Sources里面的顺序导致,调用顺序,原理就是Object-C的动态运行特性
      手动指定通过调整Compile Sources的顺序



42.  现在都ARC了,还有必要手动使用自动释放池么?如果有的话什么情况会用到?

43.  GCD能实现 NSOperation 的最大并发数和依赖关系么?怎么实现?

44.  在报unrecognized selector之前都发生了些什么?

45.  改变view的frame,layer的frame是否会变化?改变layer.frame,view的frame是否会变化?请问原因是什么?

46.  你理解的runloop和线程之间的关系?

48.  NSTimer精确么?什么情况下会不精确?NSTimer在@property 上用什么关键字修饰?为什么?

49.  [2,null]能解析么?解析后是什么?

50. FMDB 报 deadlock\database is locked如何解决?

51. GET请求将参数拼接在URL就可以,不需要其他校验,对么?GET将参数拼在URL上,所以是明文,没有POST安全,对么?

53.
54.逆向 
   iOS运行原理
   C/C++语法基础
   工具:
   检测工具:Reveal snoop-it
   反汇编工具: IDA Hopper
   调试 工具  LLDB
   开发工具 Theos 
55.深入了解OC对象

56.CoreGraphics绘图

57.app启动过程
 load
58.Category的本质
59.
Socket
XMPP
60.
加密:

MD5详解
Base64加密解密
RSA非对称加密
AES对称加密
61.
音频:
Core Audio
Audio Toolbox
OpenAL
AVFoundation
Speex语音聊天
AudioQueue/AudioSession
Speex
62.
视频:
AAC视频.H264推流
P2P传输
直播
直播的技术分析与实现
RTMP协议
RTMP直播应用与延时分析
如果做一款inke版的App
推流发布和播放RTMP
FFmpeg
基于FFmpeg的推流器
HLS流媒体传输协议(HTTP Live Streaming)
FFmpeg
ijkPlayer
63.
算法:
冒泡排序
快速排序
插入排序
归并排序
二分查找
希尔排序
动态规划
堆排序

猜你喜欢

转载自blog.csdn.net/sinat_29998157/article/details/80404940