前段时间工作裸辞之后,便开始了漫长的找工作历程,没有做任何准备就开始去面试,才发现很多基础部扎实。概念性的东西答不上来,不怪别人挑剔,要怪只能怪自己学艺不精,丢人,必须得把这些东西搞通,不然就别去丢人了。
1、值类型和引用类型的区别
值类型的变量直接存数据,数据通常被分配在栈上,使用效率比较高,而引用类型的变量是持有的是数据的引用,变量存储在数据堆中
值类型(value type):byte、 short、int、long、float、struct、char、bool、double统称为值类型。值类型变量声明之后,不管有没有对变量进行赋值,编译器都会为变量分配内存空间。
引用类型(reference type):string和class统称为引用类型。引用类型分配在托管堆中;引用类型的变量通常包含一个指向变量的一个引用,变量通过指针来引用实例。
总的来说,值类型的变量包含这个值的数据,而引用类型的变量则是包含这个实例变量的引用。
2、swift中enum、struct、class的同异
struct是值类型,class是引用类型,关于值类型跟引用类型上面已经讲过;
如有不清楚,去看一下这个。
https://blog.csdn.net/see_you_in_the_past/article/details/44653249
3、iOS开发持续集成,自动打包,移步这里https://www.jianshu.com/p/5d59966eaecc,我就不做过多的抄袭。
4、 https原理
https= http + SSL/TLS
SSL(secure socket layer):安全套接字层(计算机网络第468页有具体讲述)
宏观描述:握手、密钥导出、数据传输三个阶段
如何加密?
在tcp连接建立,注意跟HTTP不同的是连接的端口号是443,有一次客户端与服务端的握手确定加密协议,具体步骤:
客户端把所支持的一套加密算法发送给服务端
服务端选择一套加密算法,并返回一个公钥(数字证书)给客户端
客户端收到公钥并对公钥进行验证合法性(证书的颁发机构和过期时间等等)
客户端生成一个主密钥(MS),并用公钥对这个主密钥(MS)加密后生成的主密钥(EMS)
客户端把这个EMS发送给服务端
服务端收到EMS,并用私钥对EMS解密然后取得MS,后续的数据传输都用MS对信息进行加密
(参考:计算机网络自顶向下方法第8章第6节,使用TCP连接安全:SSL)
5、实现iOS客户端fps监听
什么是fps?
fps是屏幕的刷新频率(针频),人的肉眼最大能察觉的是 24HZ,大于24HZ人就察觉不到界面卡顿,流畅,反之亦然;在iOS设备针频最大是60fps,也就是屏幕每秒刷新60次
实现方案:CADisplayLink类,苹果给出来的api里就一个初始化方法
- (CADisplayLink *)displayLinkWithTarget:(id)target selector:(SEL)selector;
displayLink依赖于runLoop监听哪一个线程的RunLoop
即添加到runloop,selector才能被执行
-
(void)addToRunLoop:(NSRunLoop *)runloop forMode:(NSString *)mode;
有添加就有移除 -
(void)removeFromRunLoop:(NSRunLoop *)runloop forMode:(NSString *)mode;
当把displayLink添加到mainRunLoop之后这个selector方法会在每次刷新屏幕之前执行
在selector方法内部记录下最后一次刷新的时间然后用当前的时间戳减去最后一次刷新的时间戳,然后用这个时间刷新的次数除以时间戳的差值,得到的值就是当前屏幕的刷新频率fps了,具体代码如下:
@interface viewController()
@property NSTimeInterval lastTimestamp;
@property CADisplayLink displayLink ;
@property int countPerFrame;
@end -
(void)viewDidLoad {
[super viewDidLoad];
///target selector 模式初始化一个实例
self.displayLink= [CADisplayLink displayLinkWithTarget:self selector:@selector(envokeDisplayLink:)];
///加入一个runLoop
[self.displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
} -
(void)envokeDisplayLink:(CADisplayLink *)displayLink {
if (_lastTimestamp == -1) {
_lastTimestamp = displayLink.timestamp;
return;
}
_countPerFrame ++;
NSTimeInterval interval = displayLink.timestamp - _lastTimestamp;
if (interval < 1) {
return;
}
_lastTimestamp = displayLink.timestamp;
CGFloat fps = _countPerFrame / interval;
}
网友评论