ios面试常用

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,此包发送完成,服务器和客户端进入连接状态,完成三次握手。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

义中

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值