iOS面试题技术实现逻辑整理

2020-09-06  本文已影响0人  纵昂

今年工作不好找,太难了,面试也是杳无音讯。好多公司都采用混合开发,iOS原生进入低谷期。原生开发已变的很寒冷了。失业在家没啥事整理面试题。没事就背背,理解理解。

1、iOS-微信支付流程

1.注册微信开放平台,创建应用获取appid,APPSecret,申请支付功能,申请成功之后会返回一些参数.
2.下载微信支付SDK.
3.客户端请求订单,后台与微信后台交互,返回给客户端支付参数.
4.调用微信客户端,由微信客户端和微信服务器打交道.
5.客户端和服务器都会收到支付结果.

2、iOS开发APP的优化总结

1、CPU的优化
1)尽量使用轻量级的对象,比如用不到事件处理的地方可以考虑使用CALayer取代UIView
2)不要频繁调用UIView的相关属性,比如frame、bounds、transform等属性,尽量减少不要的修改
3)尽量提前计算好布局,在有需要的时候一次性调整对象的属性,不要多次修改属性
4)Autolayout会比直接计算frame消耗更多的CPU资源
5)图片的size最好刚好跟UIImageView的size保持一致
6)控制一下线程的最大并发量
7)尽量把耗时的操作放到自线程(文本处理(尺寸计算、绘制)、图片处理(绘制、解码)
2、GPU的优化
1)尽量避免短时间内大量图片的显示,尽可能将多张图片合成一张图片显示
2)GPU能处理的最大纹理尺寸是4096*4096,一旦超过这个尺寸就会占用CPU资源,所以纹理尽量不要超过这个尺寸
3)尽量减少视图数量和层次
4)减少透明的视图(alpha<1),不透明的就是设置opaque为YES
5)尽量避免出现离屏渲染

3、代理和通知的区别

1、效率:代理比通知高;
2、关联:delegate是强关联,委托和代理双方互相知道。通知是弱关联,不需要知道是谁发,也不需要知道是谁接收。
3、代理是一对一的关系,通知是一对多的关系。delegate一般是行为需要别人来完成。通知是全局通知。
4、代理要实现对多个类发出消息可以通过将代理者添加入集合类后遍历,或通过消息转发来实现。

4、iOS KVC底层原理、应用场景


KVC底层原理.png
当一个对象调用setValue:forKey: 方法时,方法内部会做以下操作:
1.判断有没有指定key的set方法,如果有set方法,就会调用set方法,给该属性赋值
2.如果没有set方法,判断有没有跟key值相同且带有下划线的成员属性(_key).如果有,直接给该成员属性进行赋值
3.如果没有成员属性_key,判断有没有跟key相同名称的属性.如果有,直接给该属性进行赋值
4.如果都没有,就会调用 valueforUndefinedKey 和setValue:forUndefinedKey:方法

5、iOS推送流程(APNS)

极光推送原理:
1、由App向iOS设备发送一个注册通知
2、iOS向APNs远程推送服务器发送App的Bundle Id和设备的UDID
3、APNs根据设备的UDID和App的Bundle Id生成deviceToken再发回给App
4、App再将deviceToken发送给远程推送服务器(商家自己的服务器), 由服务器保存在数据库中
5、当商家想发送推送时, 在远程推送服务器中输入要发送的消息并选择发给哪些用户的deviceToken,由远程推送服务器发送给APNs
6、APNs根据deviceToken发送给对应的用户
(1)APNs 服务器就是苹果专门做远程推送的服务器.
(2)deviceToken是由APNs生成的一个专门找到你某个手机上的App的一个标识码.
(3)deviceToken 可能会变,如果你更改了你项目的bundle Identifier或者APNs服务器更新了可能会变.

6、Objective-C简述内存管理基本原则(经常性会被问道)

iOS 5.0之前:
OC内存管理遵循“谁创建,谁释放,谁引用,谁管理”的机制
当创建或引用一个对象的时候,需要向她发送alloc、copy、retain消息
当释放该对象时需要发送release消息,当对象引用计数为0时,系统将释放该对象,这是OC的手动管理机制(MRC)。
全称 Manual Reference Counting, 是需要开发者手动标记对象以决定其在内存中的命运的运行机制。
iOS 5.0之后
引用自动管理机制——自动引用计数(ARC)。全称Automatic Reference Counting
管理机制与手动机制一样,只是不再需要调用retain、release、autorelease;
它编译时的特性,当你使用ARC时,在适当位置插入release和autorelease;
它引用strong和weak关键字
strong修饰的指针变量指向对象时,当指针指向新值或者指针不复存在,相关联的对象就会自动释放
weak修饰的指针变量指向对象,当对象的拥有者指向新值或者不存在时,weak修饰的指针会自动置为nil

7、描述下SDWebImage里面给UIImageView加载图片的逻辑(看图说话)


SDWebImage原理.jpeg
SDWebImage 中为 UIImageView 提供了一个分类UIImageView+WebCache.h, 这个分类中有一个最常用的接口sd_setImageWithURL:placeholderImage:,会在真实图片出现前会先显示占位图片,当真实图片被加载出来后再替换占位图片。
加载图片的过程大致如下:
首先会在 SDWebImageCache 中寻找图片是否有对应的缓存, 它会以url 作为数据的索引先在内存中寻找是否有对应的缓存;
如果缓存未找到就会利用通过MD5处理过的key来继续在磁盘中查询对应的数据, 如果找到了, 就会把磁盘中的数据加载到内存中,并将图片显示出来;
如果在内存和磁盘缓存中都没有找到,就会向远程服务器发送请求,开始下载图片;
下载后的图片会加入缓存中,并写入磁盘中;
整个获取图片的过程都是在子线程中执行,获取到图片后回到主线程将图片显示出来;

8、property属性的修饰符的作用(必问的哈)

ssign:方法直接赋值,不进行任何retain操作,为了解决原类型与环循引用问题;
weak:对象引用计数为0时,属性值也会自动置nil;
retain:其setter方法对参数进行release旧值再retain新值,所有实现都是这个顺序;
copy:其setter方法进行copy操作,与retain处理流程一样,先对旧值release,再copy出新的对象,retainCount为1。这是为了减少对上下文的依赖而引入的机制;
nonatomic:非原子性访问,不加同步, 多线程并发访问会提高性能。注意,如果不加此属性,则默认是两个访问方法都为原子型事务访问;
strong:强引用类型,修饰block时相当于copy;

9、HTTPS的加密原理(有的公司做vpn的,会被问到)

服务器端用非对称加密(RSA)生成公钥和私钥;
然后把公钥发给客户端, 服务器则保存私钥;
客户端拿到公钥后, 会生成一个密钥, 这个密钥就是将来客户端和服务器用来通信的钥匙;
然后客户端用公钥对密钥进行加密, 再发给服务器;
服务器拿到客户端发来的加密后的密钥后, 再使用私钥解密密钥, 到此双方都获得通信的钥匙;

10、iOS中的多线程

主要有三种:NSThread、NSoperationQueue、GCD

在家没啥事就整理技术问题(不定期更新),总结经验教训,工作中遇到的问题难点,偶尔会做些兼职私活维持生活,慢慢找工作。奥利给!!!

上一篇下一篇

猜你喜欢

热点阅读