1.mvc和mvvm的区别
mvc:是model -view-controller
model持有数据
view负责将数据展示给用户并接收用户的事件
controller负责将model和view关联起来,当model发生变化时controller可以通过Nsnotification或者KVO来进行监听然后通知view进行相应的改变,view发生变化时controller可以通过delegate或者block来进行监听然后相应的改变model
mvvm:是model-view-viewmodel
model持有数据(也可以添加一些业务逻辑)
viewmodel是把model和view进行了绑定,当model变化时view会跟着变化,当view接收到事件时model也会跟着变化
controller则负责将viewmodel展示出来
mvc的优点:model和view分离,可扩展性强有利于重用,生命周期成本低
mvc的缺点:controller过于庞大不好维护
mvvm的优点:对controller进行了瘦身,便于代码移植(一个viewmodel可以绑定到不同的view/controller上)、兼容mvc
mvvm的缺点:文件数量会增加,数据绑定后bug更难调试
2.blcok
什么是block:是带有自动变量的匿名函数,block可以定义在方法的内部或者外部,只有调用block是才会执行{}内的代码
为什么要用block,block其实就是一个方法,用block可以让上下文更加连贯,更加直观
block表达语法 ^返回值类型(参数){ 表达式}
//不带变量名的block
^int (int count)
{
return count+1;
};
//带变量名的block
int(^testBlk)(int count)=^(int count)
{
NSlog(@"%d",count);
};
//调用block
testBlk(20);
//声明一个block属性
@property (nonatomic ,copy) void (^successfulChongZhi)(int state);
//调用block
self.successfulChongZhi(1);
//监听block回调
view.successfulChongZhi = ^(int state) {
NSlog(@"%d",state);
};
//以上block如果只是在一个类的内部调用的话可以写成如下方式
void(^ successfulChongZhi)(int state)=^(int state)
{
NSlog(@"%d",state);
};
//调用
successfulChongZhi(1);
int a = 20;
void(^blk)()=^{
NSlog(@"%d",a);
}
a = 10;
blk();
//这个时候打印出来的是 10
//如果用__block修饰则会打印出20,并且可以在block的{}中对a的值进行修改
__block int a = 20;
block为什么要用copy修饰,block默认会存储在栈区(栈是吃了吐),所以block会在函数调用结束后被销毁,再次调用会出现空指针异常。用copy修饰可以让block保存在堆区(堆是吃了拉),它的生命周期会随着对象的销毁而结束,只要对象不销毁我们就可以调用堆中的block
3.应用程序的生命周期
未运行-未激活(在前台但是没有接受事件)-激活(在前台并且接受事件)-退到后台-挂起
4.vc的生命周期
当一个视图控制器被创建,并在屏幕上显示的时候。 代码的执行顺序
1、 alloc 创建对象,分配空间
2、init (initWithNibName) 初始化对象,初始化数据
3、loadView 从nib载入视图 ,通常这一步不需要去干涉。除非你没有使用xib文件创建视图
4、viewDidLoad 载入完成,可以进行自定义数据以及动态创建其他控件
5、viewWillAppear 视图将出现在屏幕之前,马上这个视图就会被展现在屏幕上了
6、viewDidAppear 视图已在屏幕上渲染完成
当一个视图被移除屏幕并且销毁的时候的执行顺序,这个顺序差不多和上面的相反
1、viewWillDisappear 视图将被从屏幕上移除之前执行
2、viewDidDisappear 视图已经被从屏幕上移除,用户看不到这个视图了
3、dealloc 视图被销毁,此处需要对你在init和viewDidLoad中创建的对象进行释放
5.ios应用程序启动过程
1、解析plist文件
①加载相关信息比如,闪屏页
②检查app的权限
2、加载类目中的方法、加载+load方法
3、执行程序
①加载main函数
②加载applicationDidiFinishLaunch方法
优化:减少didFinishLaunch方法中的代码,首页尽量使用纯代码实现,viewdidload和viewwillappera方法中减少代码和使用懒加载的方式
6.http tcp udp
tcp /ip 可分为三层 网络层、传输层、应用层
http 是应用层的协议 指的是超文本传输协议
ip是网络层的协议
tcp和udp是传输层的协议
TCP | UDP | |
是否连接 | 面向连接 | 面向非连接 |
传输可靠性 | 可靠 | 不可靠 |
应用场合 | 传输大量的数据,对可靠性要求较高的场合 | 传送少量数据、对可靠性要求不高的场景 |
速度 | 慢 | 快 |
http与tcp的区别 http是传输层协议,tcp是传输层协议
http是基于tcp进行数据传输的,在使用http进行数据传输之前会进行tcp的三次握手,成功之后才会发送数据。
tcp的三次握手
①客户端发送syn报给服务器,并进入syn_sent状态,等待服务期确认(syn:同步序列号)
②服务端收到syn包并确认,然后发送syn+ack包,并进入syn_recv状态
③客户端收到syn+ack包,客户端向服务器发送确认包ack,此包发送完成,服务器和客户端进入连接状态,完成三次握手。