iOS面试题整理---[难度]***

[U]推送的原理

1、注册:为应用程序申请消息推送服务。此时你的设备会向APNs服务器发送注册请求。 2、APNs服务器接受请求,并将deviceToken返给你设备上的应用程序 3、客户端应用程序将deviceToken发送给后台服务器程序,后台接收并储存。 4、后台服务器向APNs服务器发送推送消息 5、APNs服务器将消息发给deviceToken对应设备上的应用程序

 

[U]KVO的实现原理

参考:

https://www.jianshu.com/p/703aafde0c4

https://www.jianshu.com/p/e59bb8f59302

https://tech.glowing.com/cn/implement-kvo/[自己实现KVO]

https://www.jianshu.com/p/703aafde0c40[自己实现KVO]

基本的原理:

当观察某对象 A 时,KVO 机制动态创建一个对象A当前类的子类,并为这个新的子类重写了被观察属性 keyPath 的 setter 方法。setter 方法随后负责通知观察对象属性的改变状况。

深入剖析:

Apple 使用了 isa 混写(isa-swizzling)来实现 KVO 。当观察对象A时,KVO机制动态创建一个新的名为:NSKVONotifying_A 的新类,该类继承自对象A的本类,且 KVO 为 NSKVONotifying_A 重写观察属性的 setter 方法,setter 方法会负责在调用原 setter 方法之前和之后,通知所有观察对象属性值的更改情况。 (备注: isa 混写(isa-swizzling)isa:is a kind of ; swizzling:混合,搅合;)

①NSKVONotifying_A 类剖析:在这个过程,被观察对象的 isa 指针从指向原来的 A 类,被 KVO 机制修改为指向系统新创建的子类 NSKVONotifying_A 类,来实现当前类属性值改变的监听;所以当我们从应用层面上看来,完全没有意识到有新的类出现,这是系统“隐瞒”了对 KVO 的底层实现过程,让我们误以为还是原来的类。但是此时如果我们创建一个新的名为“NSKVONotifying_A”的类,就会发现系统运行到注册 KVO 的那段代码时程序就崩溃,因为系统在注册监听的时候动态创建了名为 NSKVONotifying_A 的中间类,并指向这个中间类了。

(isa 指针的作用:每个对象都有 isa 指针,指向该对象的类,它告诉 Runtime 系统这个对象的类是什么。所以对象注册为观察者时,isa 指针指向新子类,那么这个被观察的对象就神奇地变成新子类的对象(或实例)了。) 因而在该对象上对 setter 的调用就会调用已重写的 setter,从而激活键值通知机制。
—>我猜,这也是 KVO 回调机制,为什么都俗称KVO技术为黑魔法的原因之一吧:内部神秘、外观简洁。
②子类setter方法剖析:KVO 的键值观察通知依赖于 NSObject 的两个方法:willChangeValueForKey:和 didChangevlueForKey:,在存取数值的前后分别调用 2 个方法: 被观察属性发生改变之前,willChangeValueForKey:被调用,通知系统该 keyPath 的属性值即将变更;当改变发生后, didChangeValueForKey: 被调用,通知系统该 keyPath 的属性值已经变更;之后, observeValueForKey:ofObject:change:context: 也会被调用。且重写观察属性的 setter 方法这种继承方式的注入是在运行时而不是编译时实现的。

KVO 为子类的观察者属性重写调用存取方法的工作原理在代码中相当于:

-(void)setName:(NSString *)newName{

  [self willChangeValueForKey:@"name"]; //KVO 在调用存取方法之前总调用

  [super setValue:newName forKey:@"name"]; //调用父类的存取方法

   [self didChangeValueForKey:@"name"]; //KVO 在调用存取方法之后总调用

}

 
[U]NSNotification的底层实现?
NSNotificatinonCenter是使用观察者模式来实现的用于跨层传递消息,用来降低耦合度。NSNotificatinonCenter用来管理通知,将观察者注册到NSNotificatinonCenter的通知调度表中,然后发送通知时利用标识符name和object识别出调度表中的观察者,然后调用相应的观察者的方法,即传递消息(在Objective-C中对象调用方法,就是传递消息,消息有name或者selector,可以接受参数,而且可能有返回值),如果是基于block创建的通知就调用NSNotification的block。
 
[U]java中ArrayList和LinkList的区别,增删改查的复杂度;
1.ArrayList是实现了基于动态数组的数据结构,LinkedList是基于链表结构。
2.对于随机访问的get和set方法,ArrayList要优于LinkedList,因为LinkedList要移动指针。
3.对于新增和删除操作add和remove,LinkedList比较占优势,因为ArrayList要移动数据
 

[U]Swift的优缺点?

Swift比Objective-C有什么优势?
1、Swift容易阅读,语法和文件结构简易化。
2、Swift更易于维护,文件分离后结构更清晰。
3、Swift更加安全,它是类型安全的语言。
4、Swift代码更少,简洁的语法,可以省去大量冗余代码
5、Swift速度更快,运算性能更高。
Swift目前存在的缺点
1、版本不稳定,之前升级Swift3大动刀,苦了好多人,swift4目前还未知
2、使用人数比例偏低,目前还是OC的天下
3、社区的开源项目偏少,毕竟OC独大好多年,很多优秀的类库都不支持Swift,不过这种状况正在改变,现在有好多优秀的Swift的开源类库了
4、公司使用的比例不高,很多公司以稳为主,还是在使用OC开发,很少一些在进行混合开发,更少一些是纯Swift开发。
5、偶尔开发中遇到的一些问题,很难查找到相关资料,这是一个弊端。
6、纯Swift的运行时和OC有本质区别,一些OC中运行时的强大功能,在纯Swift中变无效了。
7、对于不支持Swift的一些第三方类库,如果非得使用,只能混合编程,利用桥接文件实现。

 

[U]序列化与反序列化

序列化: 将数据结构或对象转换成二进制串的过程。 反序列化:将在序列化过程中所生成的二进制串转换成数据结构或者对象的过程。序列化与反序列化操作同属于类NSJSONSerialization。

序列化:

将Json对象转化为Json字符串

NSData *jsonData = [NSJSONSerialization dataWithJSONObject:jsonObj options:NSJSONWritingPrettyPrinted error:&error];

NSString *jsonStr = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];

反序列化:

服务器返回JSON字符串JsonStr,将其转换为Foundition Object。

NSData *jsonData = [jsonStr dataUsingEncoding:NSUTF8StringEncoding];

NSDictionary *resultDic1 = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:nil];


[U]做过哪些渲染优化?

参考:iOS APP渲染性能优化

1.尽量避免使用半透明
2.UIImageView的大小和资源大小一致;UILabel的高度要为整数
3.不要使用非32bit颜色格式的图片资源
4.不要直接使用layer.cornerRadius和layer.masksToBounds设置图片的圆角
5.设置layer的阴影时,显式的指定shadowPath
6.其它注意事项
 
[U]C语言中strlen和sizeof的区别?
1、sizeof是C/C++中的一个运算符,其作用是返回一个对象或者类型在内存中所占用的字节数。
注意:sizeof后面如果是类型则必须加括号,如 sizeof(char);而如果是变量名则可以不加括号,如 sizeof a; 但是建议使用时  均加上括号。sizeof不能返回动态地被分配的数组的大小。
2、strlen是C语言中的库函数,所在头文件为#include <string.h>其函数原型为unsigned int strlen(char *s); 其中s为指定的字符串。
注意:strlen只能用char *作为参数,它求的是字符串的实际长度,方法是从开始到遇到第一个'\0'结束。
#include<stdio.h> 
#include<string.h> 
#define PRAISE "My name is Bai Jiangwei" 
int main(void) { 
    char name[40] = "BaiJiangWei";
    printf("%u  %u \n",strlen(name),sizeof(name)); 
    printf("%u  %u \n",strlen(PRAISE),sizeof(PRAISE)); 
}
//运行结果
11  40
23  24
Press any key to continue

//结论
1.对于一个字符串变量,strlen()的结果是字符串本身的长度,在本例中BaiJiangWei长度为11;而sizeof(name)的结果是该字符串变量在定义时的长度,
在本例中char name[40],故sizeof(name)结果为40 2.对于一个字符串常量,我们定义时并没有定义其长度,所以strlen()的结果就是字符串本身长度,而sizeof()的结果是strlen()+1,多出来的长度1,实际上就是\0 --------------------- 作者:纪晓岚爱coder 来源:CSDN 原文:https://blog.csdn.net/weixin_37815691/article/details/82886973 版权声明:本文为博主原创文章,转载请附上博文链接!
 
 
[U]iPhone自带的AssistiveTouch你如何实现?

可以自定义View:https://github.com/zhengwenming/WMDragView

 

[U]App包的大小受哪些影响?
1.图片资源,代码
 
[U]转到后台的应用如何保持活跃,而不被系统kill;应用转到后台的整个过程是怎样的?
1.VOIP 2.定位服务 3.后台下载 4.在后台循环播放无声音乐
 
[U]听说过websocket吗?
WebSocket 是一种网络通信协议。
* WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。 它的最大特点就是,服务器可以主动向客户端推送信息, 客户端也可以主动向服务器发送信息,是真正的双向通讯。
* 其他特点包括:
(1)建立在 TCP 协议之上,服务器端的实现比较容易。
(2)与 HTTP 协议有着良好的兼容性。默认端口也是80和443,并且握手阶段采用 HTTP 协议,因此握手时不容易屏蔽,能通过各种 HTTP 代理服务器。
(3)数据格式比较轻量,性能开销小,通信高效。
(4)可以发送文本,也可以发送二进制数据。
(5)没有同源限制,客户端可以与任意服务器通信。
(6)协议标识符是ws(如果加密,则为wss),服务器网址就是 URL。   
为什么要使用WebSocket? 
* HTTP 协议是一种无状态的、无连接的、单向的应用层协议。
* 它采用了请求/响应模型。通信请求只能由客户端发起,服务端对请求做出应答处理。
* 如果实时的监控数据,需要客户端每隔一段时间去请求数据,看看有没有最新的数据,  这种请求方式特别消耗流量,体验也不是很好。
* WebSocket 连接允许客户端和服务器之间进行全双工通信, 以便任一方都可以通过建立的连接将数据推送到另一端。
* WebSocket 只需要建立一次连接,就可以一直保持连接状态。
* 这相比于轮询方式的不停建立连接显然效率要大大提高。 
常用第三方库:【Starscream】(”https://cocoapods.org/pods/Starscream“)
 
[U]如果有一个比内存大的大文件(100G),那么如何实现排序?
可以将100G文件分成多个小文件并排序,这样就得到多个有序的小文件;接下来进行归并排序。
现在有了n个有序的小文件,怎么合并成1个有序的大文件? 把所有小文件读入内存,然后内排? (⊙o⊙)… no! 利用如下原理进行归并排序:
这里写图片描述我们举个简单的例子: 文件1:3,6,9 文件2:2,4,8 文件3:1,5,7 第一回合: 文件1的最小值:3 , 排在文件1的第1行 文件2的最小值:2,排在文件2的第1行 文件3的最小值:1,排在文件3的第1行 那么,这3个文件中的最小值是:min(1,2,3) = 1 也就是说,最终大文件的当前最小值,是文件1、2、3的当前最小值的最小值,绕么? 上面拿出了最小值1,写入大文件.第二回合: 文件1的最小值:3 , 排在文件1的第1行 文件2的最小值:2,排在文件2的第1行 文件3的最小值:5,排在文件3的第2行 那么,这3个文件中的最小值是:min(5,2,3) = 2 将2写入大文件. 也就是说,最小值属于哪个文件,那么就从哪个文件当中取下一行数据.(因为小文件内部有序,下一行数据代表了它当前的最小值)
 
[U]如果让你自己实现下拉刷新的功能,你如何实现;
实现原理一共有两种,第一种是利用 UITabelView 的headerView ,另一种是利用 UIScrollView 的类拓展 ,后一种方式是更被人接受的。
 

[U]简单介绍加壳,混淆,安全,逆向,hook等???

[U]如果你要将一个大文件进行拷贝,你能想到哪些可能存在的问题?(拷贝中编辑文件、拷贝太久影响主界面、显示进度、拷贝时应用切到后台、拷贝时应用被系统杀死)针对这些问题你如何解决?

[U]哈希表如何处理冲突

https://www.cnblogs.com/kwklover/articles/837942.html

[U]Autolayout底层实现???

[U]异常是如何收集的,底层的原理是什么???

 

 

 

 

 

 

 

T

posted @ 2019-03-09 15:50  yuhui.Mr  阅读(317)  评论(0编辑  收藏  举报