iOS开发面试(2020-04-15)

参考资料:(https://juejin.im/post/5d7f35976fb9a06b20059680)

开发小知识(二)::http://www.cocoachina.com/articles/26507

一、基础

1、static & const & extern
static修饰局部变量:将局部变量的本来分配在栈区改为分配在静态存储区,静态存储区伴随着整个应用,也就延长了局部变量的生命周期。
static修饰全局变量:本来是在整个源程序的所有文件都可见,static修饰后,改为只在申明自己的文件可见,即修改了作用域。
const:修饰变量主要强调变量是不可修改的。            
extern:主要是用来引用全局变量,先在本文件中查找,本文件中查找不到再到其他文件中查找。常把 extern 和 const 联合使用在项目中创建一个文件,这个文件中包含整个项目中都能访问的全局常量。
2、 NSString / NSArray / NSDictionary 经常使用 copy 关键字,为什么?如果改用strong关键字,可能造成什么问题?
因为他们有对应的可变类型:NSMutableString、NSMutableArray、NSMutableDictionary,他们之间可能进行赋值操作(就是把可变的赋值给不可变的),为确保对象中的字符串值不会无意间变动,应该在设置新属性值时拷贝一份。如果我们使用是 strong ,那么这个属性就有可能指向一个可变对象,如果这个可变对象在外部被修改了,那么会影响该属性。
总结:使用copy的目的是,防止把可变类型的对象赋值给不可变类型的对象时,可变类型对象的值发送变化会无意间篡改不可变类型对象原来的值。
3、单个viewController的生命周期?
- initWithCoder:(NSCoder *)aDecoder:(如果使用storyboard或者xib)
- loadView:加载view
- viewDidLoad:view加载完毕
- viewWillAppear:控制器的view将要显示
- viewWillLayoutSubviews:控制器的view将要布局子控件
- viewDidLayoutSubviews:控制器的view布局子控件完成  
- viewDidAppear:控制器的view完全显示
- viewWillDisappear:控制器的view即将消失的时候
- viewDidDisappear:控制器的view完全消失的时候
- dealloc 控制器销毁
4、CADisplayLink、 NSTime和GCD定时器。

参考:https://blog.csdn.net/pearl0922/article/details/99169088?depth_1-utm_source=distribute.pc_relevant.none-task-blog-OPENSEARCH-12&utm_source=distribute.pc_relevant.none-task-blog-OPENSEARCH-12

5、OC与swift的区别

二、高级

1、Shell 脚本
2、卡顿检测原理。

卡顿检测:
1、监听runloop状态为before waiting状态下是否卡顿。
2、监听runloop状态在after waiting和before sources之间。
(kCFRunLoopBeforeSources和kCFRunLoopAfterWaiting的runloop状态检测判断app是否卡顿。)

3、weak 原理说明。

一个对象可能会被多次弱引用,当这个对象被销毁时,我们需要找到这个对象的所有弱引用,所以我们需要将这些弱引用的地址(即指针)放在一个容器里(比如数组)。当对象不再被强引用时需要销毁的时候,可以在SideTable中 通过这个对象的地址找到引用值,清空引用值。同时, SideTable结构中还有weak_table_t结构,该结构也是一个散列表,key 为对象地址,value 为一个数组,里面保存着指向该对象的所有弱指针。当对象释放的时候,先清空引用哈希表RefcountMap对应的引用值,遍历弱指针数组,依次将各个弱指针置为 nil。

4、自旋锁 & 互斥锁

线程安全中为了实现线程阻塞,一般有两种方案:一种是让线程处于休眠状态,此时不会消耗 CPU 资源;另一种方案是让线程忙等或空转,此时会消耗一定的 CPU 资源。前者属于互斥,后者属于自旋。自旋在线程加锁的情况下,会一直尝试是否解锁,如果没有解锁,会一直循环判断,如果锁已经放开,则继续执行,不再是空转状态。OSSpinLock 属于自旋锁,Pthred 库中相关的锁,以及 NSLock、@synchronized 等都属于互斥锁。OSSpinLock目前已经不再安全,因为会出现优先级反转问题。 现代操作系统一般采用 时间片轮转算法 调度进程或线程,按照线程的优先级为不同的线程分配不同的时间,优先级越高分配的时间片越多。假设有两个线程 thread1 和 thread2,其中 thread1 的优先级高于 thread2,即thread1 分配的时间片多余 thread2。如果 thread2 正在锁内安全执行,一段时间后 thread1 执行任务时,发现锁未打开,于是会处于忙等状态。由于thread1 的优先级高于 thread2,此时系统会分配更多的时间片给 thread1,thread2 时间片减少,迟迟不能完成,thread1 却一直等待。如此就造成线程优先级反转。

你可能感兴趣的:(iOS开发面试(2020-04-15))