iOS 面试

让面试官陷入你的写轮眼幻术(iOS面试系列)

2021-03-22  本文已影响0人  iOS的火影乱斗

推荐阅读:关于iOS面试题汇总(栏目持续更新)

image

各位最近应该忙于跳槽与面试吧,毕竟金三银四,珍惜好机会,预祝大家面试顺利通过,迎接大厂offer。有需要资料可以私聊我了解

从输入url到页面展示到底发生了什么

iOS高频(基础+底层)面试题

你在开发过程中常用到哪些定时器,定时器时间会有误差吗,如果有,为什么会有误差?

iOS中常NSTimer、CADisplayLink、GCD定时器,其中NSTimer、CADisplayLink基于NSRunLoop实现,故存在误差,GCD定时器只依赖系统内核,相对一前两者是比较准时的。

误差原因是:与NSRunLoop机制有关, 因为RunLoop每跑完一次圈再去检查当前累计时间是否已经达到定时设置的间隔时间,如果未达到,RunLoop将进入下一轮任务,待任务结束之后再去检查当前累计时间,而此时的累计时间可能已经超过了定时器的间隔时间,故会存在误差。

block是类吗,有哪些类型?

block也算是个类,因为它有isa指针,block.isa的类型包括

这个isa可以按位运算

block的分类,__block的作用,block循环引用产生的原因及解决办法

浅复制和深复制的区别?

答案:浅层复制:只复制指向对象的指针,而不复制引用对象本身。
深层复制:复制引用对象本身。
意思就是说我有个A对象,复制一份后得到A_copy对象后,对于浅复制来说,A和A_copy指向的是同一个内存资源,复制的只不过是是一个指针,对象本身资源
还是只有一份,那如果我们对A_copy执行了修改操作,那么发现A引用的对象同样被修改,这其实违背了我们复制拷贝的一个思想。深复制就好理解了,内存中存在了
两份独立对象本身。
用网上一哥们通俗的话将就是:
浅复制好比你和你的影子,你完蛋,你的影子也完蛋
深复制好比你和你的克隆人,你完蛋,你的克隆人还活着。

类别的作用?继承和类别在实现中有何区别?

答案:category 可以在不获悉,不改变原来代码的情况下往里面添加新的方法,只能添加,不能删除修改。
并且如果类别和原来类中的方法产生名称冲突,则类别将覆盖原来的方法,因为类别具有更高的优先级。
类别主要有3个作用:
(1)将类的实现分散到多个不同文件或多个不同框架中。
(2)创建对私有方法的前向引用。
(3)向对象添加非正式协议。
继承可以增加,修改或者删除方法,并且可以增加属性。

oc中的协议和java中的接口概念有何不同?

答案:OC中的代理有2层含义,官方定义为 formal和informal protocol。前者和Java接口一样。
informal protocol中的方法属于设计模式考虑范畴,不是必须实现的,但是如果有实现,就会改变类的属性。
其实关于正式协议,类别和非正式协议我很早前学习的时候大致看过,也写在了学习教程里
“非正式协议概念其实就是类别的另一种表达方式“这里有一些你可能希望实现的方法,你可以使用他们更好的完成工作”。
这个意思是,这些是可选的。比如我门要一个更好的方法,我们就会申明一个这样的类别去实现。然后你在后期可以直接使用这些更好的方法。
这么看,总觉得类别这玩意儿有点像协议的可选协议。"
现在来看,其实protocal已经开始对两者都统一和规范起来操作,因为资料中说“非正式协议使用interface修饰“,
现在我们看到协议中两个修饰词:“必须实现(@requied)”和“可选实现(@optional)”。

oc中可修改和不可以修改类型。

答案:可修改不可修改的集合类。这个我个人简单理解就是可动态添加修改和不可动态添加修改一样。
比如NSArray和NSMutableArray。前者在初始化后的内存控件就是固定不可变的,后者可以添加等,可以动态申请新的内存空间。

关于多态性

答案:多态,子类指针可以赋值给父类。
这个题目其实可以出到一切面向对象语言中,
因此关于多态,继承和封装基本最好都有个自我意识的理解,也并非一定要把书上资料上写的能背出来。
最重要的是转化成自我理解。

通知和协议的不同之处?

答案:协议有控制链(has-a)的关系,通知没有。
首先我一开始也不太明白,什么叫控制链(专业术语了~)。但是简单分析下通知和代理的行为模式,我们大致可以有自己的理解
简单来说,通知的话,它可以一对多,一条消息可以发送给多个消息接受者。
代理按我们的理解,到不是直接说不能一对多,比如我们知道的明星经济代理人,很多时候一个经济人负责好几个明星的事务。
只是对于不同明星间,代理的事物对象都是不一样的,一一对应,不可能说明天要处理A明星要一个发布会,代理人发出处理发布会的消息后,别称B的
发布会了。但是通知就不一样,他只关心发出通知,而不关心多少接收到感兴趣要处理。
因此控制链(has-a从英语单词大致可以看出,单一拥有和可控制的对应关系。

线程和进程的区别?

1> 一个应用程序对应一个进程,一个进程帮助程序占据一块存储空间

2> 要想在进程中执行任务,就必须开启线程,一条线程就代表一个任务

3> 一个进程中允许开启多条线程,也就是同时执行多个任务

Objective-C如何对内存管理的,说说你的看法和解决方法?

1> 每个对象都有一个引用计数器,每个新对象的计数器是1,当对象的计数器减为0时,就会被销毁

2> 通过retain可以让对象的计数器+1、release可以让对象的计数器-1

3> 还可以通过autorelease pool管理内存

如果用ARC,编译器会自动生成管理内存的代码

堆和栈的区别?

1> 堆空间的内存是动态分配的,一般存放对象,并且需要手动释放内存

2> 栈空间的内存由系统自动分配,一般存放局部变量等,不需要手动管理内存

  1. 为什么很多内置的类,如TableView的delegate的属性是assign不是retain?
    1> tableView的代理一般都是它所属的控制器,控制器会对它内部的view做一次retain操作

2> 假设tableView也对代理(控制器)做一次retain操作,那么就出现循环retain问题

  1. 定义属性时,什么情况使用copy、assign、retain?
    1> copy:NSString、Block等类型

2> assign:基本数据类型

3> retain:OC对象类型

App冷启动优化?

App冷启动优化方案博客非常之多,概括总结大致如下:

  1. pre-main优化:减少动态静态库,合并动态库,移除废弃第三方库及所依赖的系统库,二进制重排(抖音优化方案)

  2. runtime对类的注册,类对象的初始化,load方法加载阶段:精简类,合并分类,移除废弃分类等等

  3. main函数之后,推迟对三方库注册及延时调用耗时操作函数。可以通过Instruments-->Time Profiler: 性能分析,定位耗时函数

pushViewController和presentViewController有什么区别

两者都是在多个试图控制器间跳转的函数

presentViewController提供的是一个模态视图控制器(modal)

pushViewController提供一个栈控制器数组,push/pop

多线程的底层实现?

1.首先搞清楚什么是线程、什么是多线程

2.Mach是第一个以多线程方式处理任务的系统,因此多线程的底层实现机制是基于Mach的线程

3.开发中很少用Mach级的线程,因为Mach级的线程没有提供多线程的基本特征,线程之间是独立的

4.开发中实现多线程的方案

C语言的POSIX接口:#include <pthread.h>
OC的NSThread
C语言的GCD接口(性能最好,代码更精简)
OC的NSOperation和NSOperationQueue (基于GCD)

哪些情况下使用kvo会崩溃,怎么防护崩溃?

使用不当 会crash,比如:

如何防护?

1.注意移出对象 匹配
2.内存野指针问题,一定要在对象销毁前移出观察者 3.可以使用第三方库BlockKit添加KVO,blockkit内部会自动移除Observer避免crash.

简述iOS中的内存管理方式

通知,代理,block,KVO的使用场景分别是什么,有什么区别?

请iOS的小伙伴关注 !喜欢的话给一个赞吧!谢谢!谢谢!谢谢!

上一篇下一篇

猜你喜欢

热点阅读