前一阵在趣直播平台上看了我就叫Sunny怎么了 大神的iOS 面试小灶直播,总结下直播的内容。
简历中的问题
1.项目描述过于简单宽泛
- 项目规模?
 - 你在其中的职责
 - 详细介绍使用的技术
 - 遇到的问题、坑以及如何解决的?
 
2.专业技能前篇一律
- 在列举技术名词时最好写出用这个技术干了什么?
比如“熟练应用Objc runtime 技术,曾使用它做了ViewController 进入和退出时的AOP 埋点”3.格式、拼写、细节
 - Object-C
 - Foudation
 - ios
 - xCode
 
4.提供更多的信息来体现你的特别
- Blog
 - GitHub
 - 技术探索
 - 对技术的个人理解
 - 做过什么有意思的事儿
 
我就叫Sunny怎么了 的一般套路
- 最近的工作,App,负责哪些模块(考察前一份工作的难度)
 - 找个最熟悉的业务,描述一下设计结构,UI层级,控件的使用,布局,交互效果等(考察基本业务能力,熟练程度,质量)
 - 考察几个基础的问题,如内存管理,多线程
 - 从简历里熟练或掌握的技术中找几个深聊
 - 找面试者研究过的,有心得或熟练的东西聊
 - 考虑更深度的问题
 - 沟通是否顺畅
 
几个面试题
property
@property能使用哪些关键字及作用是什么?
答:
| 属性 | 作用 | 
|---|---|
| strong | 释放旧对象将旧对象的值赋予输入对象,再提高输入对象的索引计数为1 | 
| weak | weak不增加对对象的引用计数,也不持有对象,因此不能决定对象的释放。它比assign多了一个功能,当对象消失后自动把指针变成nil | 
| assign | 简单赋值,不更改索引计数,适用于基础数据类型(NSInteger CGFloat)和C数据类型(int float double char 等)简单数据类型 | 
| copy | 对应mutableCopy。此属性只对那些实行了NSCopying协议的对象类型有效。根据调用类型不同,决定是深拷贝还是浅拷贝,一般都是浅拷贝,只复制了指针,内容还是同一份 | 
| atomic | 和 nonatomic用来决定编译器生成的getter和setter是否为原子操作,atomic 设置成员变量的@property属性时 默认为是atomic 提供线程安全。在多线程环境下,原子操作是必要的否则会引起错误的结果。 | 
| nonatomic | 非原子性访问对于属性赋值的时候不加锁,多线程并发访问会提高性能,如果不加此属性则默认是两个访问方法都为原子型事务访问。 | 
| readonly | 此标记说明属性是只读的 | 
| readwrite | 此标记说明属性会被当成读写的 这也是默认的属性 | 
| unsafe_unretained | 跟weak类似,声明一个弱引用,但是当引用计数为0时,变量不会自动设置为nil | 
| getter | 指定 get 方法,并需要实现这个方法。必须返回与声明类型相同的变量,没有参数 | 
| setter | 指定 set 方法,并需要实现这个方法。带一个与声明类型相同的参数,没有返回值(返回空值) | 
- 下面这4种写法的区别
 
  | 
  | 
答:
array0如果传进来的是mutableArray ,如果里面元素被改变的话,会可能出现问题;
array1标准写法,当传经来的是mutableArr时,会变成不可变版本,但里面元素不会复制一份,都是浅拷贝;
array2是标准写法;
array3当设置时,会被变成不可变版本,后续如果调用mutableArr的消息,会导致crash;
基本内存管理
下面对象分别在什么时候释放?
  | 
  | 
- obj0 是一个字符串,分配在常量区,所以不会释放
 - obj1 是weak 指向obj0 会生成一个map 来映射对象和指针的关系,当对象释放时,会反向查找所有的指针,将指针置为nil。这里obj0 是个常量,不会被释放,所以obj1不会释放
 - obj2 当对象用完就会释放
 - obj3 这行语句结束就会释放
 - obj4 定义在一个scope里,scope结束就会释放
 - obj5 会加到自动释放池中,会在最近的
AutoreleasePool pop被释放 - obj6 可能随时都会被释放
 
UIViewController
这样写会发生什么?
  | 
  | 
第一次self.view 时会调用loadView方法加载view ,当加载结束后会调用viewDidLoad。有可能递归调用,但是如果之后没有操作self.view 就不会递归,屏幕上回黑屏。
UITableView
UITableViewDataSource 和 UITableViewDelegate 中的主要方法有哪些,调用顺序和时机是怎样的?
block 内存管理
如何解决下面代码的问题
  | 
  | 
解决方案:
  | 
  | 
  | 
  | 
  | 
  | 
前两种都有weakself 都有提前被释放的可能,会导致crash,第三种比较全面
block 内存管理 Extension
下面的 self 用不用 weak ?
  | 
  | 
那这个呢?
  | 
  | 
动画block 是瞬间执行的,不会持有self的
代码规范改错
  | 
  | 
修改如下:
  | 
  | 
理解应用架构
MVC和MVVM的理解Stack和Heap分别的使用,如果管理?ARC是如何实现的?Autorelease对象何时释放?AutoreleasePool是如何实现的- 理解
Class与对象模型 - 理解
RunLoop 
深入理解消息机制
问题:从写入[obj foo] 这行代码知道运行时foo 被调用,尽量详细描述中间都发生了什么?
  | 
  | 
魔法数字
  | 
  | 
输出sunny,在64位下,指针的空间很大,比实际指向的值还大,所以采用Tagged Pointer 机制,直接在指针的地址里存放值。
另辟蹊径的block 调用
  | 
  | 
答:
  | 
  | 
  | 
  | 
  | 
  | 
  | 
  | 
  | 
  | 
  | 
  | 
  | 
  | 
谈谈iOS 进阶
- 要去联想、理解、有自己的思考、对技术的主见
 - 抽象、领悟、类比能力
 - 看书、看博客、实战总结、刨根问底
 - 进阶速度
纯日常开发 < 纯看书、博客 < 自己试验、Demo < 写博客 < 系统性分享和讨论 < 提供完整的开源方案 - 对技术保持好奇
 - 对原理刨根问底
 - 不甘于重复劳动
 - 多思考,多怀疑
 - 相信实践,不要轻信”大神”