前言:今日头条的iOS高级开发岗第三面,下面记录这次面试的回忆以作日后复习。
一、自我介绍
简单介绍一下你自己吧
- 解析:简单介绍下自己的名字,教育背景,现在的工作,做过的项目
二、自我介绍衍生的口头问题
讲讲下你在你项目中做过的优化或者技术难点
- 解析:介绍了自己封装的一个集picker,文本域的灵活展开的表视图。这个视图的数据源是json,怎么转成模型数组的?这个cell有哪些类型?展示的怎么区分这些cell?这里面有用过复用机制吗?这些cell有实现过多重继承吗?
- 题外话:这种问题最好各人自己找问题讲讲,不多,提前准备一个你项目中非常擅长并熟悉的点,即可。
三、编程题:实现以下功能
- 编写一个自定义类:Person,父类为NSObject
- 解析:头文件这样写
@interface Person:NSObject
- 该类有两个属性,外部只读的属性
name
,还有一个属性age
- 解析:
name
的修饰符nonatomic
,strong
,readonly
。age
的修饰符nonatomic
,copy
。
- 为该类编写一个初始化方法
initWithName:(NSString *)nameStr
,并依据该方法参数初始化name
属性。
- 解析:头文件声明该方法,实现文件实现该方法
- 如果两个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的实现