关于iOS开发:2021年整理的iOS高频面试题及答案总会有你需要的

5次阅读

共计 4825 个字符,预计需要花费 13 分钟才能阅读完成。


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

从输出 url 到页面展现到底产生了什么

  • 1、输出地址
  • 2、浏览器查找域名的 IP 地址
  • 3、浏览器向 web 服务器发送一个 HTTP 申请
  • 4、服务器的永恒重定向响应
  • 5、浏览器跟踪重定向地址
  • 6、服务器解决申请
  • 7、服务器返回一个 HTTP 响应
  • 8、浏览器显示 HTML
  • 9、浏览器发送申请获取嵌入在 HTML 中的资源(如图片、音频、视频、CSS、JS 等等)

iOS 高频 (根底 + 底层) 面试题

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

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

误差起因是:与 NSRunLoop 机制无关,因为 RunLoop 每跑完一次圈再去查看以后累计工夫是否曾经达到定时设置的间隔时间,如果未达到,RunLoop 将进入下一轮工作,待工作完结之后再去查看以后累计工夫,而此时的累计工夫可能曾经超过了定时器的间隔时间,故会存在误差。

block 是类吗,有哪些类型?

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

  • _NSConcreteGlobalBlock 跟全局变量一样, 设置在程序的数据区域 (.data) 中
  • _NSConcreteStackBlock 栈上(后面讲的都是栈上的 block)
  • _NSConcreteMallocBlock 堆上

这个 isa 能够按位运算

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

  • blcok 分为全局 blcok,堆 block,栈 block。
  • 在 MRC 下: 只有没有拜访内部变量,就是全局 block。拜访了内部变量,就是栈 block。显示地调用 [block copy] 就是堆 block。
  • 在 ARC 下: 只有没有拜访内部变量,就是全局 block。如果拜访了内部变量,那么在拜访内部变量之前存储在栈区,拜访内部变量之后存储在堆区。
  • __block 的作用: 将内部变量的传递模式由值传递变为指针传递,从而能够获取并且批改内部变量的值。同样,内部变量的批改,也会影响 block 函数的输入。
  • block 循环援用问题:当一个类的对象持有 block,block 外面又援用了这个对象,那么就是一个循环援用的关系。能够用 strong-weak-dance 的办法解除循环援用。

    浅复制和深复制的区别?

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

有想要支付收费材料的能够进裙或者加好友支付,这里有一个 iOS 交换圈710 558 675 能够来理解, 分享 BAT,阿里面试题 面试教训 探讨技术,裙里材料间接下载就行,大家一起交流学习!

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

答案: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 栈空间的内存由零碎主动调配,个别寄存局部变量等,不须要手动治理内存

为什么很多内置的类,如 TableView 的 delegate 的属性是 assign 不是 retain?

1 tableView 的代理个别都是它所属的控制器,控制器会对它外部的 view 做一次 retain 操作
2 假如 tableView 也对代理(控制器)做一次 retain 操作,那么就呈现循环 retain 问题

定义属性时,什么状况应用 copy、assign、retain?

1 copy:NSString、Block 等类型
2 assign:根本数据类型

3> retain:OC 对象类型

App 冷启动优化?

App 冷启动优化计划博客十分之多,概括总结大抵如下:

pre-main 优化: 缩小动静动态库,合并动静库,移除废除第三方库及所依赖的零碎库,二进制重排(抖音优化计划)

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

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, 比方:

增加和移出不是成对呈现且存在多线程增加 KVO 的状况, 常常遇到的 crash 是移出 – 内存 dealloc 的时候 或者对象销毁前没有正确移出 Observer

如何防护?

1. 留神移出对象 匹配
2. 内存野指针问题, 肯定要在对象销毁前移出观察者 3. 能够应用第三方库 BlockKit 增加 KVO,blockkit 外部会主动移除 Observer 防止 crash.

简述 iOS 中的内存治理形式

iOS 的内存治理用的是援用计数的办法,分为 MRC(手动援用计数)和 ARC(主动援用计数)。
MRC: 开发者手动地进行 retain 和 release 操作,对每个对象的 retainCount 进行 +1,- 1 操作,当 retainCount 为 0 时,零碎会主动开释对象内存。
ARC: 开发者通过申明对象的属性为 strong,weak,retain,assign 来治理对象的援用计数,被 strong 和 retain 润饰的属性变量零碎会主动对所润饰变量的援用计数进行自增自减操作,同样地,retainCount 为 0 时,零碎会开释对象内存。

  • 告诉,代理,block,KVO 的应用场景别离是什么,有什么区别?
    告诉: 实用于毫无关联的页面之间或者零碎音讯的传递,属于一对多的信息传递关系。例如零碎音量的扭转,零碎状态的扭转,利用模式的设置和扭转,都比拟适宜用告诉去传递信息。
  • 代理: 一对一的信息传递形式,实用于互相关联的页面之间的信息传递,例如 push 和 present 进去的页面和原页面之间的信息传递。
  • block: 一对一的信息传递形式,效率会比代理要高(毕竟是间接取 IMP 指针的操作形式)。实用的场景和代理差不多,都是互相关联页面之间的页面传值。
  • KVO: 属性监听,监听对象的某一属性值的变动情况,当须要监听对象属性扭转的时候应用。例如在 UIScrollView 中,监听 contentOffset,既能够用 KVO,也能够用代理。然而其余一些状况,比如说 UIWebView 的加载进度,AVPlayer 的播放进度,就只能用 KVO 来监听了,否则获取不到对应的属性值。

有想要支付收费材料的能够进裙或者加好友支付,这里有一个 iOS 交换圈:710 558 675 能够来理解,分享 BAT, 阿里面试题、面试教训,探讨技术,裙里材料间接下载就行,大家一起交流学习!
有想要的面试材料或者其余材料也能够找我,欢送征询!

文章到这里就完结了,你也能够私信我及时获取面试相干材料。如果你有什么意见和倡议欢送给我留言。

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

正文完
 0