美文网首页
面试总结二

面试总结二

作者: 纳兰沫 | 来源:发表于2020-12-23 13:35 被阅读0次

    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请求的耗时

    相关文章

      网友评论

          本文标题:面试总结二

          本文链接:https://www.haomeiwen.com/subject/ugpibktx.html