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

各位最近应该忙于跳槽与面试吧,毕竟金三银四,珍惜好机会,预祝大家面试顺利通过,迎接大厂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交流圈:891 488 181 可以来了解,分享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> 栈空间的内存由系统自动分配,一般存放局部变量等,不需要手动管理内存

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

  • 添加和移出不是成对出现且存在多线程添加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交流圈:891 488 181 可以来了解,分享BAT,阿里面试题、面试经验,讨论技术,裙里资料直接下载就行, 大家一起交流学习!

有想要的面试资料或者其他资料也可以找我,欢迎咨询!需要的可自行下载




文章到这里就结束了,你也可以私信我及时获取面试相关资料。如果你有什么意见和建议欢迎给我留言。

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

2021年,整理的iOS高频面试题及答案(总会有你需要的)相关推荐

  1. 10年测开经验面试35K公司后,吐血整理出高频面试题和答案!

    一:前言 在当今竞争激烈的职场环境中,拥有丰富的测试开发经验已成为众多企业青睐的重要条件之一.而在面试过程中,高频面试题更是能够考察应聘者的实际能力和知识水平.本文作者具备10年的测试开发经验,并通过 ...

  2. 初一计算机基础知识试题及答案,【2017年整理】计算机基础知识试题及答案.doc...

    [2017年整理]计算机基础知识试题及答案 (一)单选题(40)1.在资源管理器窗口中,被选中的文件或文件夹会____B___.A.加框显示 B.反像显示C.加亮显示 D.闪烁显示2.在Windows ...

  3. 2021年西式面点师(中级)试题及答案及西式面点师(中级)考试试题

    题库来源:安全生产模拟考试一点通公众号小程序 2021年西式面点师(中级)试题及答案及西式面点师(中级)考试试题,包含西式面点师(中级)试题及答案答案和解析及西式面点师(中级)考试试题练习.由安全生产 ...

  4. 《招聘一个靠谱的iOS》面试题参考答案(下)

    参考: <招聘一个靠谱的iOS>面试题参考答案(下) <招聘一个靠谱的iOS> 25 _objc_msgForward函数是做什么的,直接调用它将会发生什么? _objc_ms ...

  5. 2021年中式面点师(高级)试题及答案及中式面点师(高级)实操考试视频

    题库来源:安全生产模拟考试一点通公众号小程序 中式面点师(高级)试题及答案考前必练!安全生产模拟考试一点通每个月更新中式面点师(高级)实操考试视频题目及答案!多做几遍,其实通过中式面点师(高级)理论考 ...

  6. 2021 Java面试题大全(整理版)1000+面试题附答案详解,最全面详细,看完稳了!

    进大厂是大部分程序员的梦想,而进大厂的门槛也是比较高的,所以这里整理了一份阿里.美团.滴滴.头条等大厂面试大全,其中概括的知识点有:Java.MyBatis.ZooKeeper.Dubbo.Elast ...

  7. 5年大厂Java高频面试题及答案整理(二)

    31.String s = new String("xyz");创建了几个字符串对象? 答:两个对象,一个是静态区的"xyz",一个是用new创建在堆上的对象. ...

  8. 2021年整理最全Java面试题:数据结构+算法+JVM+线程+finalize+GC统统包含

    基本概念 操作系统中 heap 和 stack 的区别 什么是基于注解的切面实现 什么是 对象/关系 映射集成模块 什么是 Java 的反射机制 什么是 ACID BS与CS的联系与区别 Cookie ...

  9. 2021年最全的自动化测试面试题及答案--看完后吊打面试官!自动化测试是什么?自动化测试学什么?

    一.前言 最近有童鞋和我抱怨,说网上很难搜到那些全面又合适的自动化测试面试题,这里根据我个人的经验以及收集整理的: 你没看错,不慌,慢慢来. 先从什么是自动化测试开始说起哈! 二.什么是自动化测试? ...

最新文章

  1. 清华首超新加坡国立大学,成亚洲第一;苏州大学成211学科黑马丨US News 2021
  2. 字节增强java_java字节增加 - longjunping的个人空间 - OSCHINA - 中文开源技术交流社区...
  3. 关于JavaScript为何要限制跨域访问
  4. 『中级篇』docker之虚拟机创建vagrant技巧(番外篇)(81)
  5. 生物科学数据分析和数据管理本体论
  6. 2014025630《嵌入式程序设计》第七周学习总结
  7. SRS的2021,盐碱地里种西瓜的王婆
  8. 将ABAP On-Premises系统连接到中央检查系统以进行自定义代码迁移
  9. 物联网通信协议_自动化机器上的物联网网关的目的是什么?
  10. 思科和华为/H3C命令对比表
  11. python mqtt通信接口开发
  12. LoRa网关与服务器通信——PROTOCOL
  13. 从0写USB摄像头驱动程序
  14. 倒序输出数组 (彩蛋:抖机灵)
  15. python Excel表序号(leetcode)
  16. 海康相机RTSP连接代码分析
  17. 解决 Jupyter notebook 运行SHELL 命令(!xxx), 出错: OSError: “/bin/bach“ shell not found
  18. 学计算机与学英语词汇,计算机专业常用英语词汇学习
  19. 海贼王热血航线服务器维护,《航海王热血航线》游戏进不去如何解决 维护中快速解决办法...
  20. Mituan-极客时间-漏洞挖掘与智能攻防实战

热门文章

  1. 计算机启动报警,电脑开机报警怎么办 电脑开机报警声类型总结
  2. 学网页平面设计培训,选择一家好机构
  3. Horizontal+异步+pullTorefresh+viewPager+侧滑(XListView)
  4. c++ 多重继承,an ambiguous base of
  5. c语言做bs架构_《Java软件项目(BS架构)开发》基本概念.ppt
  6. linux 局域网扫描工具
  7. ESP8266-Arduino编程实例-HC-SR04超声波传感器驱动
  8. 上位机与PLC 通讯源码 上位机与三菱PLC,西门子PLC通讯
  9. 教你使用 Python 获取美国重要经济指标数据
  10. Android截屏和录屏Demo