iOS面试题-每日十道-第十一天

作者: 放肆肆肆 | 来源:发表于2016-07-15 20:22 被阅读1055次
    有误的地方 欢迎高手能给指出

    一. 什么是动态绑定

    动态绑定是指在执行期间(非编译期)判断所引用对象的实际类型,根据其实际的类型调用其相应的方法.程序运行的过程中,把函数调用与响应调用所需要的代码想结合的过程为动态绑定

    二. 什么是协议?分几层?

    通讯协议采用了4层的层级结构,每一层都呼叫一下层所提供的网络来完成自己的需求.这4层分别为:

    • 应用层:应用程序间沟通的层,如简单电子邮件传输(SMTP).文件传输协议(FTP).网络远程访问协议(Telnet)等.
    • 传输层:在此层中,它提供了节点间的数据传送服务,如传输控制协议(TCP).用户数据协议(UDP)等.TCP和UDP给数据包加入传输数据并把它传输到下一层中,这一层负责传送数据,并且确定数据已被传送
    • 互联网络层: 负责提供基本的数据封包传送功能,让每一块数据包都能够达到目的主机(但不检查是否被正确传送),如网络协议(IP).
    • 网络接口层:对实际的网络媒体管理.定义如何使用实际网络(如Ethernet Serial Line等)来传送数据

    三. TCP和UDP的区别?这两包的字节内容有啥不同?

    TCP(Transmission Control Protocol,传输控制协议)

    TCP是基于链接的协议,也就是说,在正是收发数据前,必须和对方建立可靠的链接.一个TCP链接必须要经过三次"对话"才能建立起来,其中的过程非常复杂,简单介绍:主机A向主机B发出链接请求数据包"我给你发数据,可以吗?"这是第一次对话;主机B🐘主机A发送同意链接和要求同步(同步就是两台主机一个在发送,一个在介绍,协调工作)的数据包:"可以",这是第二次对话;主机A再发出一个数据包确认主机B的要求同步;"我发的 你接着",这是第三次对话. 三次对话的目的是使数据包发送和接受同步,经过三次对话后,主机才向主机B正是发送数据.

    UDP(User Data Protocol,用户数据报协议)

    UDP是与TCP相对应的协议.它是面向非连接的协议,它不与对方建立连接,而是直接就把数据包发送过去!
    UDP适合用于一次只传送少量的数据,对可靠性要求不高的应用环境,比如,我们经常使用"ping"命令来测试两台主机之间TCP/IP通信是否正常.其实"ping"命令的原理就想对方主机发送UDP数据包,然后对方主机确认收到数据包,如果数据包是否到达的消息及时反馈回来,那么网络就是通的。正因为UDP协议没有连接的过程,所以它的通信效果高;但也正因为如此,它的可靠性不如TCP协议高。QQ就使用UDP发消息,因此有时会出现收不到消息的情况。

    四. 你是否接触过OC中的反射机制?

    NSObject常用的方法:
    判断一个类是否属于某个类或者是它的子类
    - (BOOL)isKindOfClass:(Class)aClass;
    判断一个类对象是否为一个类的实例(不包括子类)
    - (BOOL)isMemberOfClass:(Class)aClass
    Class的反射

    • 根据字符串创建一个类
      Class class = NSClassFromString(@“Student”)
      Student *st= [class alloc]init]
    • 将类名改为字符串
      Class class = [Student class];
      NSString *str = NSStringFromClass(class);

    SEL的反射
    通过方法的字符串形式实例化方法

     SEL sel = NSSelectorFromString(@“setName:”);
          [st performSelector:sel withObject:@“Mike”];
    

    将方法变成字符串

        NSStringFromSelector(@selector(setName:));
    

    五.C和Obj-c如何混用

    • obj-c的编译器处理后缀为m的文件时,可以识别obj-c和c的代码, 处理mm文件可以识别obj-c,c,c++代码,但cpp文件必须只能用c/c++代码,而且cpp文件include的头文件中,也不能出现obj- c的代码,因为cpp只是cpp
    • 在mm文件中混用cpp直接使用即可,所以obj-c混cpp不是问题
    • 在cpp中混用obj- c其实就是使用obj-c编写的模块是我们想要的。
      如果模块以类实现,那么要按照cpp class的标准写类的定义,头文件中不能出现obj-c的东西,包括#import cocoa的。实现文件中,即类的实现代码中可以使用obj-c的东西,可以import,只是后缀是mm。
      如果模块以函数实现,那么头文件要按 c的格式声明函数,实现文件中,c++函数内部可以用obj-c,但后缀还是mm或m。

    总结:只要cpp文件和cpp include的文件中不包含obj-c的东西就可以用了,cpp混用obj-c的关键是使用接口,而不能直接使用实现代码,实际上cpp混用的是 obj-c编译后的o文件,这个东西其实是无差别的,所以可以用。obj-c的编译器支持cpp.

    六. 谈谈runtime机制

    • runtime,运行时机制,它是一套C语言库
    • 实际上我们编写的所有OC代码,最终都是转成了runtime库的东西,比如类转成了runtime库里面的结构体等数据类型,方法转成了runtime库里面的C语言函数,平时调方法都是转成了objc_msgSend函数(所以说OC有个消息发送机制)
    • 因此,可以说runtime是OC的底层实现,是OC的幕后执行者
    • 有了runtime库,能做什么事情呢?runtime库里面包含了跟类、成员变量、方法相关的API,比如获取类里面的所有成员变量,为类动态添加成员变量,动态改变类的方法实现,为类动态添加新的方法等
    • KVO是runtime的一个典型应用

    七. AFN 与 ASI 有什么区别

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

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

    编写SQL语句来操作原来表中的字段

    • 增加表字段
      ALTER TABLE 表名 ADD COLUMN 字段名 字段类型;
    • 删除表字段
      ALTER TABLE 表名 DROP COLUMN 字段名;
    • 修改表字段
      ALTER TABLE 表名 RENAME COLUMN 旧字段名 TO 新字段名;

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

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

    十. 利用Socket建立网络连接的步骤

    建立Socket连接至少需要一对套接字,其中一个运行于客户端,称为ClientSocket ,另一个运行于服务器端,称为ServerSocket.
    套接字之间的连接过程分为三个步骤:服务器监听,客户端请求,连接确认.

    • 服务器监听:服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态,等待客户端的连接请求。
    • 客户端请求:指客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。
    • 连接确认:当服务器端套接字监听到或者说接收到客户端套接字的连接请求时,就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,双方就正式建立连接。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求

    纯手动 有地方是个人理解 有误的地方希望大家能给指出 谢谢
    大家面试中遇到的问题 也可以留言分享
    如果您喜欢 或者 对您有点帮助 希望点一下喜欢 谢谢了~~

    相关文章

      网友评论

      本文标题:iOS面试题-每日十道-第十一天

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