iOS面试系列·某头条iOS高级工程师第3轮面试回忆

前言:今日头条的iOS高级开发岗第三面,下面记录这次面试的回忆以作日后复习。

一、自我介绍

简单介绍一下你自己吧

  • 解析:简单介绍下自己的名字,教育背景,现在的工作,做过的项目

二、自我介绍衍生的口头问题

讲讲下你在你项目中做过的优化或者技术难点

  • 解析:介绍了自己封装的一个集picker,文本域的灵活展开的表视图。这个视图的数据源是json,怎么转成模型数组的?这个cell有哪些类型?展示的怎么区分这些cell?这里面有用过复用机制吗?这些cell有实现过多重继承吗?
  • 题外话:这种问题最好各人自己找问题讲讲,不多,提前准备一个你项目中非常擅长并熟悉的点,即可。

三、编程题:实现以下功能

  1. 编写一个自定义类:Person,父类为NSObject
  • 解析:头文件这样写 @interface Person:NSObject
  1. 该类有两个属性,外部只读的属性name,还有一个属性age
  • 解析:name的修饰符nonatomicstrongreadonlyage的修饰符nonatomiccopy
  1. 为该类编写一个初始化方法 initWithName:(NSString *)nameStr,并依据该方法参数初始化name属性。
  • 解析:头文件声明该方法,实现文件实现该方法
  1. 如果两个Person类的name相等,则认为两个Person相等
  • 解析:重写isEqual,这里面涉及到了哈希函数在iOS中的应用。

四、由编程题衍生的口头题目

4.1

题目: 怎样实现外部只读的属性,让它不被外部篡改

解析:

  • 头文件用readonly修饰并声明该属性。正常情况下,属性默认是readwrite,可读写,如果我们设置了只读属性,就表明不能使用setter方法。在.m文件中不能使用self.ivar = @"aa"; 只能使用实例变量_ivar = @"aa";,而外界想要修改只读属性的值,需要用到kvc赋值[object setValue:@"mm" forKey:@"ivar"];

  • 实现文件里面声明私有属性,并在头文件在protocol里面规定该属性就可以了,外部通过protocol获取,这样还可以达到隐藏成员的效果。

4.2

题目: nonatomic是非原子操作符,为什么要这样,atomic为什么不行?有人说能atomic耗内存,你觉得呢?保读写安全吗,能保证线程安全吗?有的人说atomic并不能保证线程安全,你觉得他们的出发点是什么,你认同这个说法吗?

  • 关于为什么用nonatomic

如果该对象无需考虑多线程的情况,请加入这个属性修饰,这样会让编译器少生成一些互斥加锁代码,可以提高效率。

而atomic这个属性是为了保证程序在多线程情况下,编译器会自动生成一些互斥加锁代码,避免该变量的读写不同步问题。

atomic 和 nonatomic 的区别在于,系统自动生成的 getter/setter 方法不一样。如果你自己写 getter/setter,那 atomic/nonatomic/retain/assign/copy 这些关键字只起提示作用,写不写都一样。

  • 关于atomic语nonatomic的实现
还有 69% 的精彩内容
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
禁止转载,如需转载请通过简信或评论联系作者。
支付 ¥9.90 继续阅读

推荐阅读更多精彩内容