ios 基础知识整理(三)
2020-12-23 本文已影响0人
90后的晨仔
一、远程推送原理
推送流程图.jpg当设备联网的时候都会与苹果的APNS服务器建立一个长链接,当我们的后台服务器(或者叫:应用程序的服务器)(Provider)推送一条通知的时候,会先把要发送的消息、iPhone的标识打包,发给苹果的APNS服务器。 接着APNS服务器会在自身已经注册Push服务的设备列表中查找有相应标识的设备,并把消息发送到iPhone。iPhone把发来的消息传递给相应的应用程序,并且按照设预先设定好的格式在设备上弹出通知提醒。
二、http 与 https 的区别是什么?
- http是超文本传输协议,数据明文传输,不能保障数据传输的安全性。容易被抓包。
- http的连接很简单,是无状态的。并且使用的端口是80。不能验证通信方的身份,因此可能会遭遇伪装。
- https 则是具有安全性的SSL加密传输协议。端口使用的是443。
- Https协议需要使用CA付费申请证书,是具有安全性的 SSL 加密传输协议。
三、深拷贝与浅拷贝
1.两者的定义
- 浅拷贝: 并不会进行真正的复制,而是复制的对象和原对象都指向同一个地址。
- 深拷贝: 真正的复制了一份,复制的对象指向了新的地址。
2.总结
- 深拷贝就是内容拷贝,浅拷贝就是指针拷贝。
- 本质的区别在于:
(1).是否开启新的内存地址。
(2).是否影响内存地址的引用计数。
四、反射机制如何使用?可以参考这篇博客
// SEL和字符串转换
FOUNDATION_EXPORT NSString *NSStringFromSelector(SEL aSelector);
FOUNDATION_EXPORT SEL NSSelectorFromString(NSString *aSelectorName);
// Class和字符串转换
FOUNDATION_EXPORT NSString *NSStringFromClass(Class aClass);
FOUNDATION_EXPORT Class __nullable NSClassFromString(NSString *aClassName);
// Protocol和字符串转换
FOUNDATION_EXPORT NSString *NSStringFromProtocol(Protocol *proto) NS_AVAILABLE(10_5, 2_0);
FOUNDATION_EXPORT Protocol * __nullable NSProtocolFromString(NSString *namestr) NS_AVAILABLE(10_5, 2_0);
通过上边的方法可以动态的创建自己需要的实例,也可以动态的选择调用哪一个方法。
//1.将字符串@"ViewController"转换成Class。
Class class = NSClassFromString(@"ViewController");
//2.创建控制器的实例。
ViewController *vc = [[class alloc] init];
//3.把对应的"reloadData"方法名生成SEL。
SEL selector = NSSelectorFromString(@"reloadData");
//4.执行该方法
[vc performSelector:selector];
五、SDWebImage 加载图片的原理
加载原理的流程图.png参考的这篇博客这里我只是做了整理总结。
原理文字描述: SDWebImage 采用的是二级缓存的机制。当我们调用从网络获取图片的时候,会根据图片的URL先去本地
内存
中查找,如果查找到的话就直接展示,若没有找到的话就会去硬盘
中去查找,若查找到的话就展示,未查找到就去网络请求下载图片,下载完成之后将图片进行解码,解码后去展示图片,然后在将图片保存到内存
和硬盘
中进行缓存。
六、runtime 的消息转发流程是什么?整理参考这篇博客,像原文作者致敬。
Snip20201225_1.png利用上图进行分析总结消息转发的流程:
例如现在有一个对象叫JCCat,然后又有一个方法叫eat。方法调用为[JCCat eat]。
- 动态解析方法
当接收到未知消息的时候(假设JCCat
对象中的eat
方法未实现),runtime 会调用+(BOOL) resolveInstanceMethod:(实例方法) 或者+resolveClassMethod:(类方法)。
2.备用接收者
若以上方法做了相关的处理,那么消息会正常处理。若以上方法没有做处理,runtime会调用- (id)forwardingTargetForSelector:(SEL)aSelector方法。若该方法返回了一个非nil(也不能是self)的对象,而且该该对象实现了这个方法,那么这个对象就成了消息的接收者,消息就被分发到改对象。使用情况:通常在对象内部使用,让内部的另一个对象处理消息,在外边看起来就像是该对象处理了消息。
3.完整的消息转发
在- (void)forwardInvocation:(NSInvocation *)anInvocation方法中选择转发消息的对象,其中anInvocation对象封装了未知消息的所有细节,并保留调用结果发送到原始调用者。