一个偶然的面试机会——我既然懵了

刚刚辞职没有几天,其实我并没有打算这么早就去找工作的,就是因为有事情要处理所以才辞职,然后准备在家休息几天的时候,既然突然收到一个电话说叫我去面试的,当时已经是委婉的拒绝了的,但是对方好像很礼貌,而且说看了我的博客网站和工作,很希望能去面试一下,或者了解一下,于是我就了解了一下他们公司的情况,最后通过各方面考虑答应了会准时赴约…….

两天之后我就准时去面试了,并且中间发生了一些挺有意义的事情。

  1. 第一面的时候,遇到了一个自称为是我粉丝的人,当然我好像比他还要激动😂😂😂
  2. 第三面既然发现老板是老乡,只是很早就来广州发展了,于是我们用方言聊了起来。

其中第一面和第二面的时候大部分都是技术型的问题这里根据自己的记忆,做了一下相关的整理。

部分答案会后期再做整理和分享

第一面:

在一个小房间等了几分钟之后,来了两位面试官,面带微笑的跟我握了手,并且其中一位说了一句:你就是iCocos。
当时我就懵逼了,结果他告诉我,看了我们的博客网站,github,也一直在关注,曾经还给我评论了,发了邮件请教过问题,当时场面有点尴尬,因为我根本想不起来什么了,然后就这样过了,,,,,,,

第一面主要问了下面这些问题:

  1. 说说Swift函数式编程和面向协议编程
  2. TCP,UDP,HTTP,Socket之前的一些区别和理解
  3. 你都用Runtime做过撒
  4. KOV和KVC的理解还有底层实现?
  5. 100万个中去出其中最大的100个,你会怎么做?说说为什么这么做?
  6. MVVM结合RAC在实际项目中给你带来了什么方便之处。
  7. 如何做数据埋点
  8. 说说Objective-C中的消息和转发机制
  9. iOS开发中事件处理是怎么实现的,什么是响应链?
    ……

第二面:

面完第一面之后,又在里面等了大概十分钟,来了一个身材很丰满的大哥,说是公司的技术总监,于是我们就聊了起来。

  1. 首先聊的是项目,一开始就教我打开项目演示,并且告诉他那些事我做的,亮点和难点在哪里?
  2. 做过或者了解过音视频编解码吗?说说你所知道的。
  3. CI和CD是怎么什么做的,中间遇到了什么问题?你是这么处理这些问题的?
  4. 这么保证我们开发的项目,数据,源码,请求等更加安全?
  5. 为什么HTTP链接是三次握手,关闭需要四次?
  6. 自动自动释池是什么?
  7. 属性与成员变量的区别?
  8. 什么是RunLoop?
  9. 什么是Blcok,使用的时候需要注意什么?还有__block的实现是什么?
  10. 说说多线程,并说说你使用最多的方式,为什么?
    ………

一二面总结

到这里,两轮面试大概就完了,当然上面大概是我所能想起来的一些,其中还有一些随便聊到的,具体问题也不记得了,但是大概能起一下关键字什么的?

比如:

轮询
Swift
FMDB安全
WWDC2017新东西
SwiftJSON
Mansory
签名机制
几个常用第三方的理解和实现

第二面:

两轮技术面试完了之后,接来下是最后一轮,第三轮,是和老板聊,和老板聊的时候,感觉就不一样了,老板看了我的简历说,我们既然是老乡,然后就直接用起来老家话,聊了一伙,虽然是老乡,但是毕竟人家是老板,我是来面试的,也不能太嚣张,所以一路下来我还是很礼貌变现很正常的回答他的问题,并且最后走的时候还留了他的微信和电话……

就这样整个面试就结束了,讲真的,这场面试还是有很多东西值得学习的,不管是前面两轮技术上的知识,即使很多我都快忘了。还是后面跟老板聊到的一下生活,理想上的问题,我都有在思考......

面试已经过去两天了,暂时还没有收到什么消息,虽然我并没有太多期望,我也知道前面技术面试表现并不是很好,不管是因为我知识面不够还有理解的不够深入,我觉得这一次还是值得了,因为至少我知道了自己还有很多方面是不足的!

之后大概整理一下,上面一些相关的技术问题和部分问题的答案,由于个人能力有限,如果有不对或者误解的地方,还有见谅并指出,谢谢!

消息

消息机制:忽略-nil-IMP-缓存-方法(重复父-根)-存或者转发-函数指针-实现

转发机制:动态(动态添加),标准(别的对象执行),快速(其他形式执行),发送消息获取签名,非空就转发,否则奔溃退出

事件

响应:view-VC/父视图-window-application-丢弃
传递:事件添加到application队列-取出传递给窗口-寻找最适合View(主窗口是否接受-触摸点是否在自己身上-重复子控件)-没有就自己处理调用touches

KOV&KVC

KVO基于KVC,KVC基于Runtime

KVC:字符串非访问器,类型混合指针:方法名-环境变量-结合isa找接口-找实现。检测ket对应的set方法-同名_key成员属性-同名属性_key-undefine.
KVO:创建派生类-重写setter方法(isa假的,指向的是派生类),willchange,didchange监听内部path

Block

block(闭包):C语言的拓展,基于指针和函数指针,一种匿名函数的结构体;

堆栈的拷贝,__block修饰的变量会变成__block_bref_val_0的结构体,它包含实例变量本身__forwarding(用于访问局部变量val)。
block拷贝到堆上的时候:
_val_0也会拷贝到堆上,局部变量销毁,block任然能对堆上的局部变量操作
__forwarding替换为堆上的__block变量的地址
栈上的_val_0结构体中的__forwarding指针也会指向堆上的结构体
main函数或者blcok释放的时候,只是释放了栈上的东西,所有对局部变量的操作都已经移到了对上。

Copy

block:MRC传下来的,MRC中block在栈去,copy将其放到堆区,ARC中不写也可以的,编译器对block进行了copy操作
NSString:对应可变类型,防止被修改。 不可变使用strong,防止判断影响性能。不可变的数据类型线程更安全。

GCD

基于XNU,在libdispatch库,queue管理block操作,source:处理事件,
基于C语言(NSO基于GCD),只支持FIFO(NSO可调整和设置并发数),依赖复杂(NSO简单且支持KVO),速度快。任务添加到队列,NST使用NSObject的分类实现通讯

RunLoop

运行循环(不断处理事件),至少一个时间源,事件接受与分发机制,一步执行不能并行执行,保证程序执行的线程不被终止,有事情做的时候,根据具体事件类型通知应用做出响应,没有就会进入休眠,省电,再次发生会唤醒处理事件(通过Observer监听,并释放自动释放池)。

input:传递异步时间,通讯与传输
timer:传递同步事件

销毁发生在线程结束的时候,很少主动创建,而是把事件添加到runloop。
每次RonLoop完成一个缓存都会检测retainCount是否为0

成员变量和属性

属性=成员变量+get+set,编译器自动合成,@dy告诉编译器我们自己实现,没有实现编译的时候没有问题,运行的时候就会报错,说找不到对应的方法。

成员变量地址可根据实例的内存地址偏移寻址,属性读写需要函数调用(访问器),相对更慢,C++成员变量更合适(不支持copy等)
多线程情况保证数据一致,同步执行的时候使用成员变量,同步的时候set,get会降低效率,锁影响
成员变量可以直接管理内存,属性进行了多层封装,还能复写,容易出错
默认用属性生成不必要的set,get方法,体积变大

自动释放池(存储指针变量)&AutorreleasePool

autorrelease把对象放入到自动释放池(延迟释放),自动释放池释放的时候,内部的对象引用计数-1,
AutorreleasePool:接受对象向他发送的release消息,记录该对象的release消息,自动释放池销毁的时候,想池中记录的对象发送release消息

释放时机:autorrelease的}执行完后,实际是autorrelease对象在当前Runloop(Push,Pop)迭代结束的时候释放

AutorreleasePoolPage(Push,Pop)一个个page组成,4096字节大小,每个AutorreleasePoolPage双向链表链接形成一个自动释放池。

三次和四次

服务端接受到客户端的请求信号报文后,可以直接发送信号和应答报文。关闭的是,服务端收到信号报文的时候,很可能不会立即关闭,只能先回一个应答报文,告诉客户端我收到了你的报文,只有等服务端所有报文发送我哪里才会发送关闭的信号报文,所以不能一起发送

总结

长轮询:服务端的程序加入到一个死循环,在循环中检测数据的变动

desc:NSLog底层调用,Array答应打印元素,NSObject打印类名和指针

区块链:一串使用密码学方法相关联产生的数据块(包含比特币网络交易信息,验证有效和产生下一个快)

KVC:因为使用字符串所以比较慢,无法检测错误

Swift:隐含一个Main函数,会设置并调用全局的C_ARGC C_ARGV,调用由top level code构成的top_level_code()函数

FMDB安全:创建一个GCD线程队列,读取时调用inDatabase方法,在block锁定数据库,实际对应整个数据库加锁

数组和字典:每个对象或者成为key/value时,对象计数器+1(retain),当字典或者数组销毁的时候,里面所有的元素或者key/value都会被release一次(-1),

Xcode9无线调试,APFS,ARKit,

“”,string:常量 format:堆

HTTPS=HTTPS+TLS(运行在TCP之上),TLS有独立的握手,链接,验证机制,任何一个数据包篡改,都失败,当我们使用HTTP协议来解释TLS曾携带的内容就是HTTPS

maker加入到blcok,遍历block中约束数组install

YYText:Label,Text,CoreT,图文,MacD,表情,编辑,竖

SwiftJSON不要一直判断是否存在,是否是我们想要的class,内部自动对optional拆包

SD在单例情况下,缓存使用url,磁盘使用md5

Alamofire不是类,只是命名空间,通过参数调用Manager具体方法,几乎所有操作都是通过Manager控制

RAC(singal流),RXS(Observable),监听管道sequence(状态之间的依赖,MVC中Controller中的复杂和臃肿,统一消息处理机制)

iJK(VideoToolBox,OpenGL ES,AudioQueue),视频(软硬编码),音频(软编码),从解码钱的数据缓冲区中取出一帧数据进行解码,完成后放入相应的解码后的数据缓冲区

load父先子,类先分,

cache缓存指针和vtable,加速方法调用,bits存类的方法属性协议等信息

extra_rc存额外的自动引用计数,实际计数在此基础+1,使用isa的extra_rc和SideTable存引用计数

空指针:赋值为nil,僵尸对象:对中已经被释放的对象count=0,野指针:指针没有初始化,只想的空间被释放,OC中没有空指针异常

泄露:提前赋nil,没有配对或者清空,栈区释放了,堆去没有释放 溢出:容量超过限制

类的结构isa最前面,父类的实例变量在子类的实例变量之前

define:编译器,替换,无内存,不检测类型

__block在MRC和ARC中都可以使用,可以是对象和基本类型,__weak只能在ARC中使用,只能是对象。__block可以在block在block中重新复制,但是__weak不行。

签名机制:通过摘要算法得到摘要,用私钥对摘要加密得到密文,密文+原文本+私钥对应的公钥一起发布

Get:1024k UDP:64kb AFN:60s SD:一周 线程:64个
坚持原创技术分享,您的支持将鼓励我继续创作!