iOS面试手记

作者: 萧哒哒 | 来源:发表于2021-02-23 10:11 被阅读0次

    1.Block相关问题:

    1.Block为什么要用copy

    block创建时默认分配内存在栈上,不是在堆,作用域实在创建时的作用域,在作用域外就会崩溃,所以要拷贝在堆上,在堆上才能使用本地变量

    2.Block为什么不用retain

    retain只是增加一次计数2,并没有把内存拷贝到堆上,还是会被回收

    3.为什么进入block中的对象引用计数需要自动加1

    block并不知道对象什么时候被释放,所以为了避免在使用block之前对象就被释放,所以block就retain一次

    4.Block中self的循环引用

    因为block需要使用copy到堆区,对象self就会被retain一次,会造成循环引用

    解决办法:

    在MRC下使用__block,在ARC下,使用__unsafe_unretained\weak修饰

    2.@class,#import<> 跟 #import””有什么区别?
    .#import会链入该头文件的全部信息,包括实体变量和方法等;二@class只是告诉编译器,其后面声明的名称是类的名称,至于这些类如何定义的,暂时不用考虑

    .#import<>用来包含系统自带的文件,#import""用来包含自定义的文件

    3.frame 和 bounds 有什么不同?

    frame指的是:该view在父view坐标系统中的位置和大小。(参照点是父view的坐标系统)

    bounds指的是:该view在本身坐标系统中的位置和大小。(参照点是本身坐标系统)

    4.@property = ivar + getter + setter;

    “属性” (property)有两大概念:ivar(实例变量)、getter+setter(存取方法)

    5.iOS如何内存管理

    Objective-C的内存管理主要有三种方式ARC(自动内存计数)、MRC手动内存计数、内存池

    1.自动内存计数ARC:由Xcode自动在App编译阶段,在代码中添加内存管理代码。

    2.手动内存计数MRC:遵循内存谁申请、谁释放;谁添加,谁释放的原则。

    3.内存释放池Release Pool:把需要释放的内存统一放在一个池子中,当池子被抽干后(drain),池子中所有的内存空间也被自动释放掉。内存池的释放操作分为自动和手动。自动释放受runloop机制影响。

    6.OC创建线程方法

    一共三种:GCD ,NSThread,NSOperationQueue

    7.iOS反射机制

    假设有一天公司产品要实现一个需求:根据后台推送过来的数据,进行动态页面跳转,跳转到页面后根据返回到数据执行对应的操作。可以采用反射机制来用

    反射有三种,类(NSStringFromSelector和NSSelectorFromString),方法(NSStringFromClass和NSClassFromString),协议反射(NSStringFromProtocol和NSProtocolFromString)

    例如:1.class反射 通过类名的字符串形式实例化对象。 Class class=NSClassFromString(@"student");Student*stu=[[class alloc]init];将类名变为字符串。 Class class=[Student class];NSString*className=NSStringFromClass(class);2.SEL的反射 通过方法的字符串形式实例化方法。 SEL selector=NSSelectorFromString(@"setName");[stu performSelector:selector withObject:@"Mike"];将方法变成字符串。NSStringFromSelector(@selector*(setName:));

    8.@public,@protected,@private,@package 声明各有什么含义?

    @public任何地方都能访问;@protected该类和子类中访问,是默认的;@private只能在本类中访问;@package 本包内使用,跨包不可以。

    9.UIScrollView大概是如何实现的,它是如何捕捉、响应手势的?

    拦截了touch 事件,如果在150ms中未移动,把touch事件传递给内部view,如果产生移动,则滚动,如果在150ms中未移动但是移动足够远的话,且canCancelContentTouches = YES,UIScrollView会调用touchesCancelled方法,cancel掉内部view的事件响应,并开始scrolling

    10.常用的设计模式

    代理,观察者,单例,策略,工厂模式

    11.推送的过程

    1.应用服务提供商从服务器端把要发送的消息和设备令牌(device token)发送给苹果的消息推送服务器APNs。

    2.APNs根据设备令牌在已注册的设备(iPhone、iPad、iTouch、mac等)查找对应的设备,将消息发送给相应的设备。

    3.客户端设备接将接收到的消息传递给相应的应用程序,应用程序根据用户设置弹出通知消息。

    12.假如Controller太臃肿,如何优化?

    1.将网络请求抽象到单独的类中,方便处理公共逻辑,处理缓存,做对象持久化

    2.界面封装抽象到专门类中,构造UIView的子类,负责控件拼装

    3.构造viewModel,把vc传递给view数据的过程,构造成viewmodel

    4.专门构造存储类,专门处理本地数据存取

    5.整合常量

    十三.网络层如何做安全处理

    1.尽量使用https

    2.不要传输明文密码

    3.post并不比get安全

    4.不要使用301跳转,容易被劫持,一定要使用请确保在http环境下并且做证书绑定校验

    5.http请求带上MAC

    6.http请求使用临时密钥

    7.AES使用CBC模式

    十五:TCP/IP的三次握手和四次挥手

    三次握手:client向server发送SYN报文,服务器接收后发送SYN+ACK报文,客户端接收到报文后向服务器发送ACK报文,此时客户端进入SYN_SENT状态,服务器接收到ACK报文后服务器进入SYN_RECV状态

    四次挥手:客户端向服务器发送FIN报文,服务器接收后向付出ACK报文,客户端接收ACK报文后,服务器关闭连接后悔发送FIN报文给客户端,客户端接收FIN报文后,向客户端发送ACK报文,关闭连接

    相关文章

      网友评论

        本文标题:iOS面试手记

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