面试总结二

Swift和OC的区别

1.Swift可以面向协议编程、函数式编程、面向对象编程。
2.Swift是类型安全的,代码中使用字符串String,就不能传递一个整型Int给它。编译时会做类型检查,不匹配的类型会错误标记出来。
3.典型的struct enum tuple都是值类型,Int,Double,Float,String,Array,Dictionary,Set都是用结构体实现的,也是值类型。
4.Swift的枚举可以使用整型 浮点型 字符串等,还有拥有属性和方法,甚至支持泛型,协议,扩展等
5.Swift支持泛型,支持泛型类型约束。
6.Swift对协议支持更丰富,可以实现面向协议编程。
7.Swift可以直接定义函数类型变量,可以作为其他函数参数传递,可以作为函数返回值返回。(这一点跟js的闭包很像)
1.Objective-C以面向对象编程为主,当然你可以引入类似ReactiveCocoa的类库来进行函数式编程。
2.OC则不是,你声明一个NSString变量,仍然可以传递一个NSNumber给他,编译期间只会警告,不会报错。
3.OC里面NSNumber,NSString以及集合类对象都是指针类型。
4.OC的枚举只是个标记值。
5.OC在swift2之后加入Generics泛型支持,不过泛型约束停留在编译器警告阶段。
6.OC的协议缺乏强约束,提供optional特性往往成为很多问题的来源。
7.OC需要用selector或block才能模拟Swift类似效果。
1.最明显的区别:OC一个类由.h和.m两个文件组成,而swift只有.swift一个文件,所以整体的文件数量比OC有一定减少
2.swift数据类型都会自动判断,只区分变量var和常量let
3.关于BOOL类型更加严格,swift不再是OC的非0就是真,而是true才是真false才是假
4.swift的switch语句后面可以跟各种数据类型了,如Int,字符串,元组,区间都行,并且里面不用写break
5.swift 中可以定义不继承于其它类的类,称之为基类(base calss)。
6.final关键字
使用final关键修饰的类,不能被其他类继承。
继承final修饰的类会报错:Inheritance from a final class '…..'
7.类方法修饰符:static
8.guard关键词
用处:
判断某个参数是否符合要求,不符合直接返回。省去过多的if-else语句。
9.in out关键词
in-out是修饰函数参数类型,表示该参数在函数内修改后(即函数返回后),其值为修改后的值.
适用类型为变量
in-out修饰后的参数,在传参时需&修饰

2.Swift的可选类型

可选类型

3.链表和数组的区别

1.链表是链式存储结构 数组是顺序的存储结构
2.链表是通过指针来链接元素和元素 数组则是所有元素按次序依次存储
3.链表的插入删除元素不需要移动元素 较为容易实现长度扩充 但是寻找某个元素较为困难
数组寻找元素较为简单 但是插入和删除比较复杂 由于长度编译时指定  如果达到了最大长度,需要进行扩充
4.数组在内存中连续 链表不连续

4.HTTPS的连接过程

image.png

5.TCP和UDP的区别

UDP 用户数据报协议 无连接 尽最大可能交付 面向报文  用处: 复用  分用 差错检测(详细描述具体内容)
TCP 数据传输控制协议 面向连接 面向字节流 可靠传输 拥塞避免 流量控制(详细描述具体内容)

6.TCP的粘包

7.单双链表的区别

1、指向不同:单向链表只有一个指向下一结点的指针,双向链表除了有一个指dao向下一结点的指针外,还有一个指向前一结点的指针。
2、功能不同:单向链表只能next ,双向链表可以return。
3、单双向不同:单链表只能单向读取,双向链表可以通过prev()快速找到前一结点。

单向链表优缺点:
1、优点:单向链表增加删除节点简单。遍历时候不会死循环;
2、缺点:只能从头到尾遍历。只能找到后继,无法找到前驱,也就是只能前进。

双向链表优缺点:
1、优点:可以找到前驱和后继,可进可退;
2、缺点:增加删除节点复杂,多需要分配一个指针存储空间。

8.设计模式

责任链 单列 桥接 适配器 命令

9.图片压缩原理

10.内存分布

image.png
 栈是由编译器自动分配并释放,存放函数的参数值,局部变量的值等。栈是向低地址扩展的数据结构,是不连续的内存区域,采用后进
先出(LIFO )
  由程序员分配和释放,若程序员不释放,程序结束时可能由OS回收。堆是向高地址扩展的数据结构,是不连续的内存区域,以链表的
方式进行存储
  全局区又可分为未初始化全局区:.bss段和初始化全局区:data段。全局变量和静态变量的存储是放在一块的。
初始化的全局变量和静态变量在一块区域。
未初始化的全局变量和未初始化的静态变量在相邻的另一块区域,在程序结束后有系统释放
  常量区存储常量数据,通常程序结束后由系统自动释放
  代码区用来存放函数的二进制代码,在运行时要防止被非法修改,只允许读取不允许操作

11.队列组的原理

12.+(void)load方法

+load方法会在runtime加载类、分类时调用
每个类、分类的+load,在程序运行过程中只调用一次

调用顺序
先调用类的+load
按照编译先后顺序调用(先编译,先调用)
调用子类的+load之前会先调用父类的+load

再调用分类的+load
按照编译先后顺序调用(先编译,先调用)

13.AFNetworking的安全模块

14.排序算法

冒泡排序
选择排序
插入排序
归并排序
希尔排序
堆排序
桶排序

15.是否使用过画图

16.对象的内部构成

image.png

17.iOS的启动过程

18.多线程之间的资源共享

加锁
串行执行

19.多进程之间的资源共享

1、URL scheme
   这个是iOS APP通信最常用到的通信方式,APP1通过openURL的方法跳转到APP2,并且在URL中带上想要的参数,有点类似HTTP的
get请求那样进行参数传递。这种方式是使用最多的最常见的,使用方法也很简单只需要源APP1在info.plist中配置LSApplicationQueriesSchemes,
指定目标App2的scheme;然后再目标App2的info.plist 中配置好URLtypes,表示该App接受何种URL scheme的唤起。

2、Keychain
   iOS 系统的keychain是一个安全的存储容器,它本质上就是一个sqlite数据库,它的位置存储在/private/var/Keychains/keychain-2.db,
不过它所有数据都是经过加密的,可以用来为不同的APP保存敏感信息,比如用户名,密码等。iOS系统自己也用keychain来保存VPN
凭证和WiFi密码。它是独立于每个APP的沙盒之外的,所以即使APP被删除之后,keychain里面的信息依然存在

3、UIPasteBoard
   UIPasteBoard是剪切板功能,因为iOS 的原生空间UItextView,UItextfield,UIwebView ,我们在使用时如果长按,就会
出现复制、剪切、选中、全选、粘贴等功能,这个就是利用系统剪切板功能来实现的。

4、UIDocumentInteractionController
   UIDocumentInteractionController 主要是用来实现同设备上APP之间的贡献文档,以及文档预览、打印、发邮件和复制等功能。

5、Local socket
  原理:一个APP1在本地的端口port1234 进行TCP的bind 和 listen,另外一个APP2在同一个端口port1234发起TCP的connect
连接,这样就可以建立正常的TCP连接,进行TCP通信了,然后想传什么数据就可以传什么数据了

6、AirDrop
  通过 Airdrop实现不同设备的APP之间文档和数据的分享

7、UIActivityViewController
  iOS SDK 中封装好的类在APP之间发送数据、分享数据和操作数据

8、APP Groups
   APP group用于同一个开发团队开发的APP之间,包括APP和extension之间共享同一份读写空间,进行数据共享。同一个团队开发
的多个应用之间如果能直接数据共享,大大提高用户体验

通信方式

20.数据库迁移

21.如果数据库表结构发生了变化 如何处理

22.GCD底层原理

23.开发过程中遇到的难点 如何解决的

24.项目中做了什么有关性能优化之类的事情

25.找不到方法做的防护措施

image.png

不使用forwardingTargetForSelector做转发 是因为系统的某些方法在这里做了转发 会拦截掉一些系统的方法

26.同步函数和异步函数的区别

  异步和同步是相对的,同步就是顺序执行,执行完一个再执行下一个,需要等待、协调运行。异步就是彼此独立,在等待某事件的过程中
继续做自己的事,不需要等待这一事件完成后再工作。线程就是实现异步的一个方式。异步是让调用方法的主线程不需要同步等待另一线
程的完成,从而可以让主线程干其它的事情

27.SDWebImage的图片编解码的原理

27.SDWebImage的流程

image.png

28.如何快速找到一个数组中的最大值

排序
for循环

29.如果快速拉取数据 如何防止数据不会错乱

30.线程和进程的区别

 线程和进程的区别主要在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式的影响下不会
对其他进程产生影响,而线程只是一个进程中的不同执行路径。
  线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等同于整个进程死掉,所以多进程的程序要比多线程
的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,
不能用进程。
  线程是CPU独立运行和独立调度的基本单位(可以理解为一个进程中执行的代码片段)。
  进程是资源分配的基本单位(进程是一块包含了某些资源的内存区域)。
 进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。进程是线程的容器,真正完
成代码执行的线程,而进程则作为线程的执行环境。一个程序至少包含一个进程,一个进程至少包含一个线程,一个进程中的所有线程共
享当前进程所拥有的资源

31.分类的关联属性存在哪里?如果对象释放了,会对他造成什么影响

image.png

image.png

32.dispatch_apply的底层原理

33.dispatch_source_set_timer的底层原理 为何不需要放入RunLoop就可以执行

34.建立一个HTTP请求的过程

35.网络请求的优化方案

36.如何减少一个HTTP请求的耗时

你可能感兴趣的:(面试总结二)