一、method与selector的区别:
method是程序创建的一个可执行方;
selector是函数引用,相当于指针。
二、MRC单例编写:
可以同步块实现,也可以GCD实现,但是GCD要更好,保证了线程安全,还省了代码。GCD不用考虑加锁和重量级的同步,底层都给处理好了,使用起来更高效,采用了原子访问查询标记是否执行过,有且只有一次创建;
代码如下:
+ (id)shareInstance {
static NetworkSingleton *single = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
single = [[self alloc] init];
});
return single;
}
ps: static保值作用,保证只初始化一次。
三、TCP/IP、UDP、HTTP、Socket的简要理解:
首先从网络七层结构分布来看:
1、TCP/IP协议是传输层协议,主要解决数据如何在网络层传输,从字面上看是TCP和IP的合称,实际上是指因特网整个TCP/IP协议族;HTTP协议是应用层协议,主要解决如何包装数据。
关于TCP/IP协议与HTTP协议关系为:传输数据时如果只有传输层无应用层,数据内容就无法识别,没有意义。
2、TCP与UDP的区别:同是传输层协议,但TCP面向连接,TCP三次握手在最低限度上(也是最大程度上)保证了连接的可靠性,而UDP无连接。形象上可以理解为:TCP像打电话(一再确认、三次握手才会发送数据,安全、低效),UDP像发信息(不管在不在数据都会发送出去,实时、高效、不安全)。
3、TCP三次握手的理解:第一次->客户端发送syn包到服务器,进入SYN_SEND状态等待服务器确认;第二次->服务器接收syn包,必须确认客户的SYN同时自己也发送一个syn+ack包,服务器进入SYN_RECV状态;第三次->客户端接收服务器的syn+ack包,向服务器发送确认包ACK,发送完毕客户端和服务器进入ESTABLISHED状态,完成三次握手。
4、HTTP协议即超文本传送协议,建立在TCP协议之上的一种应用,最显著的特点是客户端发送的每次请求都需要服务器回送响应,在请求结束后会主动释放连接,从建立连接到关闭连接的过程称为“一次连接”。
5、Socket是应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信。是一种“打开-读/写-关闭”模式的实现,服务器和客户端各自维护一个“文件”,在建立连接打开后,可以向自己文件写入内容供对方读取或者读取对方的内容,通讯结束时关闭文件。以使用TCP协议通讯的socket为例,流程大概是这样:
四、block实现原理:
block是OC的一个新特性,swift里是没有的,但其实是一个闭包,比如GCD里就大量使用了block,一个引用自动变量的函数。block实际上是指向结构体的指针,编译器会将block的内部代码生成对应的函数。创建block的时候,内部是创建了对应的函数,调用block的时候是调用了之前封装的函数。
实现场景eg:
A类 push到 B类可以通过属性传值,但pop回去的时候不可以,这时可用block传值。首先在B类头文件中定义block:(是否带参数根据需求所定)
@interface ClassNameVC : UIViewController
@property (nonatomic, copy) void(^myBlock)(id obj);
@end
在B类的.m文件中拿到数据方法内(跳转回去之前),调用block将数据传过去:
self. myBlock(@"B传回A的数据");
在A类需要使用数据的方法中调用其block属性声明,保存block代码段实现特定功能:
ClassNameVC *vc = [[ClassNameVC alloc] init];
//声明block
vc.editUserNameBlock = ^(id obj) {
NSString *receStr = (NSString *)obj;
yourNeedStr = receStr;
};
五、通知的优劣势:
首先理解一下概念:通知是一个单例对象,允许当事件发生时通知一些对象,允许我们在低耦合下满足控制器与一个任意对象进行通信目的,这种模式基本特征是为了让其他对象能够接收在该控制器中发生某件事情而产生的消息,控制器中用一个notificationName,对控制器来说是匿名的,其他的控制器中使用同样的notificationName来注册该特征的对象(观察者)能对通知的事件作出反应。
优势:
1、不需要大量代码,实现比较简单;
2、对于一个发出的通知,多个对象能够做出反应,即一对多的方式实现简单;
3、controller能够传递对象,对象携带了关于发送通知的自定义的消息;
劣势:
1、在编译期不会检查通知是否能够被观察者正确的处理;
2、在释放注册的对象时,需要在通知中心取消注册;
3、在调试时应用的工作以及控制过程难跟踪;
4、需要第三方对象来管理控制器与观察者对象之间的联系;
5、controller和观察者需要提前知道通知名称,UserInfo dictionary keys。如果这些没有在工作区间定义,那么会出现不同步的情况;
ps:我们平时开发中使用通信除了通知NSNotication center还有两个常用的方式:委托delegate、键值观察key value observing,KVO。
delegate优点:
1、严格的语法、所有将接收的事件必须是在delegate协议中有清晰的定义;
2、如果delegate中的一个方法没有实现就会出现编译警告/错误;
3、协议必须在controller的作用域范围内定义;
4、在一个应用中的控制流程是可跟踪的并且是可识别的;
5、在一个控制器中可以定义多个不同的协议,每个协议有不同的delegate;
6、没有第三方对象要求保持/监视通信过程;
7、能够接收调用的协议方法返回值,意味着delegate能提供反馈信息给controller。
缺点:
1、需要定义很多代码:
(1)定义协议;(2)controller的delegate属性;(3)在delegate本身中实现delegate方法定义;
2、在一个controller中有多个delegate对象,并且delegate是遵守同一个协议,但是还很难告诉多个对象同个事件。
KVO:
是一个对象能够观察另外一个对象的属性的值,并且能够发现值的变化。前面两种模式更加适合一个controller与任何其他对象进行通信,而KVO更适合任何类型的对象侦听另外一个任意对象的改变(也可以是controller,但一般不是controller)。这是一个对象与另外一个对象保持同步的一种方法,即当另外一种对象的状态发生改变时,观察对象立马作出反应。只能用来对属性作出反应,而不会对方法或者动作作出反应。
优点:
1、能提供一种简单的方法实现两个对象间的同步,如model和view的同步;
2、能够对非我们创建的对象,即内部对象的状态改变作出响应,而且不需要改变内部对象(SDK对象)的实现‘
3、能够提供观察的属性的最新值以及先前值;
4、用key paths来观察属性,因此也可以观察嵌套对象;
5、完成对观察对象的抽象,因为不需要额外的代码来允许观察值能被观察。
缺点:
1、我们观察的属性必须用strings来定义,因此编译时不会出现警告检查;
2、对属性重构将导致我们的观察代码不再可用;
3、复杂的if语句要求对象正在观察多个值,因为所有的观察代码通过一个方法来指向;
4、当释放观察者时不需移除观察者。
六、多线程:
一个进程中开启多条线程,多条线程可并发(同时)执行不同的任务。
原理:同一时间,CPU只能处理一条线程,只有一条线程在执行;多线程并发执行其实是CPU快速在多条线程之间调度切换,多核CPU是真正意义上的多线程。
优点:
能适当提高程序的执行效率;
缺点:
(1)创建线程是有开销的,iOS下主要包括:内核数据结构(约1KB)、栈空间(子线程512KB、主线程1MB);
(2)开启大量线程会降低程序性能;
(3)线程越多CPU调度线程上的开销越大;
(4)程序设计更加复杂,如线程之间通信、多线程数据共享。