不同于其他公司,上来就问runtime,runloop,block之类的,美图先问了项目中的难点,亮点以及开发中遇到的一些问题,解决流程。
开篇之后,进入正题。
1)没有由浅入深的前戏,直接问weak指针如何管理
答:有sidetable中,有一个weaktable的hashmap管理。
追问存储的数据形式是什么
答:由强指针生成key保存一个array(或许是链表,哪个大神指点一下),里面有一系列的该对象的weak指针
一般的面试到此就会结束,感觉美图好像对hashmap的要求不是一般的高,也可能是我太菜,学习到这一步就没有再深入。
追问常见的hash算法
答:不知道,这个回答显得有点low,其实用过MD5,没有把他归为算法一类。
百度之后:常见算法是MD4、MD5、SHA-1,其中,MD5、SHA-1是在MD4算法基础上改进。
怎么解决hash冲突
答:一种做法是向冲突地址前后寻找空位插入key - value值,另一种是在冲突地址后面使用链表,大于8个时,用红黑树。
由于不知道专业名词,感觉答的比较low。
百度之后:1)开放定址法: 2) 再哈希法 3)链地址法 4)建立公共溢出区
追问:优缺点
这个是真不知道了
百度之后答案如下:
开放散列表(open hashing)/拉链法(针对桶链结构) 1)优点:①对于记录总数频繁可变的情况,处理的比较好(也就是避免了动态调整的开销) ②由于记录存储在结点中,而结点是动态分配,不会造成内存的浪费,所以尤其适合那种记录本身尺寸(size)很大的情况,因为此时指针的开销可以忽略不计了 ③删除记录时,比较方便,直接通过指针操作即可 2)缺点: ①存储的记录是随机分布在内存中的,这样在查询记录时,相比结构紧凑的数据类型(比如数组),哈希表的跳转访问会带来额外的时间开销 ②如果所有的 key-value 对是可以提前预知,并之后不会发生变化时(即不允许插入和删除),可以人为创建一个不会产生冲突的完美哈希函数(perfect hash function),此时封闭散列的性能将远高于开放散列 ③由于使用指针,记录不容易进行序列化(serialize)操作
封闭散列(closed hashing)/ 开放定址法 1)优点: ①记录更容易进行序列化(serialize)操作 ②如果记录总数可以预知,可以创建完美哈希函数,此时处理数据的效率是非常高的 2)缺点: ①存储记录的数目不能超过桶数组的长度,如果超过就需要扩容,而扩容会导致某次操作的时间成本飙升,这在实时或者交互式应用中可能会是一个严重的缺陷 ②使用探测序列,有可能其计算的时间成本过高,导致哈希表的处理性能降低 ③由于记录是存放在桶数组中的,而桶数组必然存在空槽,所以当记录本身尺寸(size)很大并且记录总数规模很大时,空槽占用的空间会导致明显的内存浪费 ④删除记录时,比较麻烦。比如需要删除记录a,记录b是在a之后插入桶数组的,但是和记录a有冲突,是通过探测序列再次跳转找到的地址,所以如果直接删除a,a的位置变为空槽,而空槽是查询记录失败的终止条件,这样会导致记录b在a的位置重新插入数据前不可见,所以不能直接删除a,而是设置删除标记。这就需要额外的空间和操作。
问一个object占用的内存大小
答:分配16字节,使用了8个字节,isa指针
问一个1000*1000像素的图片占用内存大小
答:8M。这答案错的离谱,图片像素点的表示有8,16,24,32,因此图片大小分别是1,2,3,4M。
wkwebview中coocki问题
答:项目中没用过。实际项目中都是在head中添加token。
面试到此结束,出来之后就知道凉了,答案错误的地方,请看到的兄弟,给指正一下。