2020-06-17 面试总结

针对答错或者有代表性问题记录
1.合并两个有序数组
双index 可以倒序省空间 leetCode88,正序已实现
2.@property (nonatomic, copy) NSMutableXX 有什么问题?
虽然是深拷贝,但是没法再次修改
3.KVO原理,系统生成的类谁继承谁?
生成被观察的类的子类,实例对象 的 isa指针 指向新生成的子类

https://juejin.im/post/5adab70cf265da0b736d37a8#heading-0
http://liuduo.me/2018/02/07/kvo-imp/

4.KVC改变值 能被KVO观察到吗
不一定,怪异的问题

5.block 属性为什么用copy

block本身是像对象一样可以retain,和release。但是,block在创建的时候,它的内存是分配在栈(stack)上,而不是在堆(heap)上。他本身的作于域是属于创建时候的作用域,一旦在创建时候的作用域外面调用block将导致程序崩溃。

使用retain也可以,但是block的retain行为默认是用copy的行为实现的,

因为block变量默认是声明为栈变量的,为了能够在block的声明域外使用,所以要把block拷贝(copy)到堆

每个线程都有栈空间不可共享,堆空间可共享

6.数组和链表的区别
时间复杂度和面试官沟通不够 数组,链表 查找说O(n),实际一般数组说按定位查找o(1)...

7.super Class 深入原理
引用:
struct objc_super {
id receiver;
Class superClass;
};
当使用[super class]时,这时要转换成objc_msgSendSuper的方法。先构造objc_super的结构体吧,第一个成员变量就是self, 第二个成员变量是Father,然后要找class这个selector,先去superClass也就是Father中去找,没有,然后去Father 的父类中去找,结果还是在NSObject中找到了。然后内部使用函数objc_msgSend(objc_super->receiver, @selector(class)) 去调用,此时已经和我们用[self class]调用时相同了,此时的receiver还是Son* son,所以这里返回的也是Son

可以看下:
https://zesming.com/oc-super/

总结一下,就是super 是一个特殊关键字,转换为objc_msgSendSuper方法,方法的接收者仍为self,只不过查找方法沿着superClass一层一层往上找。class方法最后在NSObject找到,不管具体怎么实现,目的就是输出消息接收者的类,接收者还是self,就是 super class 经典输出 son的原因。

8.performSelector afterDelay 有什么问题
子线程 不能执行,默认没有开启runloop

9.weak原理
weak表其实是一个hash(哈希)表,Key是所指对象的地址,Value是weak指针的地址(这个地址的值是所指对象的地址)数组。
然后就是经典的三个步骤:
1.初始化:objc_initWeak 初始 weak指针

  1. 添加weak引用时:objc_storeWeak() 作用是更新指针指向,创建对应的弱引用表
  2. 销毁时:clearDeallocating 根据对象地址获取所有weak指针地址的数组,然后遍历这个数组把其中的数据设为nil,最后把这个entry从weak表中删除,最后清理对象的记录。

大家说的都一模一样,真正理解的能有多少,理解后能够再次记起细节的又有多少。。。

10.NSNotification 同步问题
放到异步线程发送notification,接收后 1.存储notification;2.利用发送NSMachPort发送信号通知主线程代理方法,再真正的在主线程处理notification;注意NSLock加锁

https://www.cnblogs.com/ludashi/p/7460907.html

NSMachPort 也是多线程通信的一种方法,之前问道就懵。。。
其实notification 接收回调里也可以选择用 dispatch_async(dispatch_get_main_queue() 或者 performSelectorOnMainThread 切回主线程。NSOperationQueue等等都可以。这几种也美名线程间通信。。。 真是啥都能这么高大上

还有一个NSNotificationQueue也能解决这个同步问题,问了下NSNotificationQueue是什么队列
答不知道。。。只知道是异步的,实际上 有 PostingStyle三种 Now特殊为同步 Asap : 当前 Runloop 完成时执行,whenIdle : 当 Runloop 处于 wait 或者 idle 状态时执行

总结:基础原理还要深入,有些东西不是不懂,之前看的计算机网络和有些东西反而没问道,算法题出乎意料我能答出来,可能不需要准备太复杂的算法题,需要准备更细节的底层原理

感想:大多数面试官是无法区分面试者的,面试题还是以平常不用的底层原理为主,然而这种题目不能完全体现开发水平,但市场现状如此,如果下次自己做面试官,会想想如何出题才能选择优秀的开发,这对自身也是一种提升。

你可能感兴趣的:(2020-06-17 面试总结)