一. 什么是动态绑定
动态绑定是指在执行期间(非编译期)判断所引用对象的实际类型,根据其实际的类型调用其相应的方法.程序运行的过程中,把函数调用与响应调用所需要的代码想结合的过程为动态绑定
二. 什么是协议?分几层?
通讯协议采用了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.
套接字之间的连接过程分为三个步骤:服务器监听,客户端请求,连接确认.
- 服务器监听:服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态,等待客户端的连接请求。
- 客户端请求:指客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。
- 连接确认:当服务器端套接字监听到或者说接收到客户端套接字的连接请求时,就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,双方就正式建立连接。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求
纯手动 有地方是个人理解 有误的地方希望大家能给指出 谢谢
大家面试中遇到的问题 也可以留言分享
如果您喜欢 或者 对您有点帮助 希望点一下喜欢 谢谢了~~
网友评论