各位最近应该忙于跳槽与面试吧,毕竟金三银四,珍惜好机会,预祝大家面试顺利通过,迎接大厂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的小伙伴关注 !喜爱的话给一个赞吧!谢谢!谢谢!谢谢!