ios开发面试题,ios开发面试题及答案

iOS开发面试拿offer攻略之block篇

Block 是将函数及其执行上下文封装起来的对象。 比如:

十余年建站经验, 网站建设、网站制作客户的见证与正确选择。成都创新互联提供完善的营销型网页建站明细报价表。后期开发更加便捷高效,我们致力于追求更美、更快、更规范。

通过 clang -rewrite-objc WYTest.m 命令编译该 .m 文件,发现该 block 被编译成这个形式:

其中 WYTest 是文件名, blockTest 是方法名,这些可以忽略。其中 WYTest blockTest_block_impl_0 结构体为

--block_impl 结构体为

block 内部有 isa 指针,所以说其本质也是 OC 对象

block 内部则为:

所以说 Block 是将函数及其执行上下文封装起来的对象

既然 block 内部封装了函数,那么它同样也有参数和返回值。

如果你正在跳槽或者正准备跳槽不妨动动小手,添加一下咱们的交流群1012951431来获取一份详细的大厂面试资料为你的跳槽多添一份保障。

这里的输出是 6 而不是 2,原因就是对局部变量 num 的截获是值截获。同样,在 block 里如果修改变量 num ,也是无效的,甚至编译器会报错。

打印为 1,2,3

局部对象变量也是一样,截获的是值,而不是指针,在外部将其置为 nil ,对 block 没有影响,而该对象调用方法会影响

输出为 2,意味着 num = 1 这里的修改 num 值是有效的,即是指针截获。同样,在 block 里去修改变量 m ,也是有效的。

编译后

( impl.isa = _NSConcreteStackBlock ;这里注意到这一句,即说明该 block 是栈 block )

可以看到局部变量被编译成值形式,而静态变量被编成指针形式,全局变量并未截获。而 --block 修饰的变量也是以指针形式截获的,并且生成了一个新的结构体对象:

该对象有个属性: num5 ,即我们用 --block 修饰的变量。这里 --forwarding 是指向自身的(栈 block )。

一般情况下,如果我们要对 block 截获的局部变量进行赋值操作需添加 --block 修饰符,而对全局变量,静态变量是不需要添加 --block 修饰符的。

另外, block 里访问 self 或成员变量都会去截获 self 。

分为全局 Block(_NSConcreteGlobalBlock) 、栈 Block(_NSConcreteStackBlock) 、堆

Block(_NSConcreteMallocBlock) 三种形式

其中栈 Block 存储在栈 (stack) 区,堆 Block 存储在堆 (heap) 区,全局 Block 存储在已初始化数据 (.data) 区

输出:

比如:

输出:

日常开发常用于这种情况:

比如堆 1中的全局进行 copy 操作,即赋值:

输出:

仍是全局 block

而对 2中的栈 block 进行赋值操作:

输出:

对栈 blockcopy 之后,并不代表着栈 block 就消失了,左边的 mallock 是堆 block ,右边被 copy 的仍是栈 block 比如:

输出:

即如果对栈 Block 进行 cop ,将会 copy 到堆区,对堆 Block 进行 copy ,将会增加引用计数,对全局 Block 进行 copy ,因为是已经初始化的,所以什么也不做。

另外, --block 变量在 copy 时,由于 --forwarding 的存在,栈上的 --forwarding 指针会指向堆上的-- forwarding 变量,而堆上的 --forwarding 指针指向其自身,所以,如果对 --block 的修改,实际上是在修改堆上的 --block 变量。

即 --forwarding 指针存在的意义就是,无论在任何内存位置,都可以顺利地访问同一个 --block 变量 。

另外由于 block 捕获的 --block 修饰的变量会去持有变量,那么如果用 --block 修饰 self ,且 self 持有

block ,并且 block 内部使用到 --block 修饰的 self 时,就会造成多循环引用,即 self 持有 block , block 持有 --block 变量,而 --block 变量持有 self ,造成内存泄漏。

比如:

如果要解决这种循环引用,可以主动断开 --block 变量对 self 的持有,即在 block 内部使用完 weakself 后, 将其置为 nil ,但这种方式有个问题,如果 block 一直不被调用,那么循环引用将一直存在。

所以,我们最好还是用 --weak 来修饰 self

以上就是 block 篇的面试题合集了,感谢观看~!

iOS 常见面试题--runloop

一、什么是runloop

二、runloop的基本作用

三、应用范畴

四、获取runloop对象

五、RunLoop相关的类

CFRunLoopRef

CFRunLoopModeRef

CFRunLoopObserverRef

六、RunLoop的运行逻辑

七、runloop与线程之间的关系

面试题1、讲讲 RunLoop,项目中有用到吗?

面试题2、runloop内部实现逻辑?

面试题3、runloop和线程的关系?

面试题4、timer 与 runloop 的关系?

面试题5、程序中添加每3秒响应一次的NSTimer,当拖动tableview时timer可能无法响应要怎么解决?

面试题6、runloop 是怎么响应用户操作的, 具体流程是什么样的?

面试题7、说说runLoop的几种状态

面试题8、runloop的mode作用是什么?

iOS面试题12-数据结构算法篇

《 2018 iOS面试题系列 》

    这里没有图啊,大家可以抽象一下。

    数据结构的存储一般常用的有两种 顺序存储结构 和 链式存储结构

    发挥想象力啊。 举个列子。数组。1-2-3-4-5-6-7-8-9-10。这个就是一个顺序存储结构 ,存储是按顺序的 举例说明啊。 栈。做开发的都熟悉。栈是先进后出 ,后进先出的形式 对不对 ?!他的你可以这样理解

    hello world 在栈里面从栈底到栈顶的逻辑依次为 h-e-l-l-o-w-o-r-l-d 这就是顺序存储 再比如 队列 ,队列是先进先出的对吧,从头到尾 h-e-l-l-o-w-o-r-l-d 就是这样排对的

    再次发挥想象力 这个稍微复杂一点 这个图片我一直弄好 ,回头找美工问问,再贴上 例如 还是一个数组

    1-2-3-4-5-6-7-8-9-10 链式存储就不一样了 1(地址)-2(地址)-7(地址)-4(地址)-5(地址)-9(地址)-8(地址)-3(地址)-6(地址)-10(地址)。每个数字后面跟着一个地址 而且存储形式不再是顺序 ,也就说顺序乱了,1(地址) 1后面跟着的这个地址指向的是2,2后面的地址指向的是3,3后面的地址指向是谁你应该清楚了吧。他执行的时候是 1(地址)-2(地址)-3(地址)-4(地址)-5(地址)-6(地址)-7(地址)-8(地址)-9(地址)-10(地址),但是存储的时候就是完全随机的。明白了?!

    还是举例子。理解最重要。不要去死记硬背 哪些什么。定义啊。逻辑啊。理解才是最重要滴

二叉树有五种表现形式

   二叉树可以转换成森林 树也可以转换成二叉树。这里就不介绍了 你做项目绝对用不到

   数据结构大致介绍这么多吧。理解为主, 别死记,死记没什么用

从现在开始介绍算法啊

   二叉树这个比较麻烦 还有平衡二叉树 有点绕 如果不懂二叉树这一块 你是百分之二百看不懂的

原文链接

整理出一份高级iOS面试题

1、NSArray与NSSet的区别?

2、NSHashTable与NSMapTable?

(注:NSHashTable与NSSet的区别:NSHashTable可以通过option设置元素弱引用/copyin,只有可变类型。但是添加对象的时候NSHashTable耗费时间是NSSet的两倍。

NSMapTable与NSDictionary的区别:同上)

3、 属性关键字assign、retain、weak、copy

4、weak属性如何自动置nil的?

5、Block的循环引用、内部修改外部变量、三种block

6、KVO底层实现原理?手动触发KVO?swift如何实现KVO?

7、categroy为什么不能添加属性?怎么实现添加?与Extension的区别?category覆盖原类方法?多个category调用顺序

8、load方法和initialize方法的异同。——主要说一下执行时间,各自用途,没实现子类的方法会不会调用父类的?

load initialize 调用时机 app启动后,runtime初始化的时候 第一个方法调用前调用 调用顺序 父类-本类-分类 父类-本类(如果有分类直接调用分类,本类不会调用) 没实现子类的方法会不会调用父类的 否 是 是否沿用父类实现 否 是

image

9、对 runtime 的理解。——主要是方法调用时如何查找缓存,如何找到方法,找不到方法时怎么转发,对象的内存布局

OC中向对象发送消息时,runtime会根据对象的isa指针找到对象所属的类,然后在该类的方法列表和父类的方法列表中寻找方法执行。如果在最顶层父类中没找到方法执行,就会进行消息转发:Method resoution(实现方法)、fast forwarding(转发给其他对象)、normal forwarding(完整消息转发。可以转发给多个对象)

11、autoreleasepool的原理和使用场景?

image

12、Autorelase对象什么时候释放?

在没有手加Autorelease Pool的情况下,Autorelease对象是在当前的runloop迭代结束时释放的,而它能够释放的原因是系统在每个runloop迭代中都加入了自动释放池Push和Pop。

13、Runloop与线程的关系?Runloop的mode? Runloop的作用?内部机制?

14、iOS中使用的锁、死锁的发生与避免

15、NSOperation和GCD的区别

16、oc与js交互

17、swift相比OC有什么优势?

18、struct、Class的区别

19、访问控制关键字(public、open、private、filePrivate、internal)

20、OC与Swift混编

21、map、filter、reduce?map与flapmap的区别?

image

22、guard与defer

23、try、try?与try!

24、@autoclosure:把一个表达式自动封装成闭包

25、throws与rethrows:throws另一个throws时,将前者改为rethrows

26、App启动优化策略?main函数执行前后怎么优化

27、crash防护?

28、内存泄露问题?

主要集中在循环引用问题中,如block、NSTime、perform selector引用计数问题。

29、UI卡顿优化?

30、架构设计模式

31、数据结构算法

32、计算机基础

我的iOS面试经历(附面试题干货)

之前,我写过一篇 2018,我要一个新的开始 ,这个新的开始马上就要开始啦...

相比前一段时间找工作时的波涛汹涌,这会算得上是风平浪静了。下面,我就谈一下我的面试经历及面试后的一些感悟。文章最后附上自己总结的面试题,供大家分享交流。由于本人文笔水平很臭,如有不通顺的地方可以在评论区指出来,看到我会麻溜的改正!对待学问是马虎不得的,你说是不?

首先,我想说目前iOS开发工作真的是不好找了(对于大牛,你就当我这话没说)。这是通过前一段时间我的亲身经历感受到的(怪我水平很臭喽)。为此,我总结出了以下四点原因:

前面说了,如果你是大牛,还用去找工作?工作都来找你了(大牛就是这么牛)。而你呢?还是好好反省反省吧!至于市场饱和,相信大家都早已经得到这个消息了。这其中既有移动互联网前期积累的泡沫破裂的原因,也有大量新的iOS开发者不断涌入的问题。我的iOS技术交流QQ群里时不时会有人出来吆喝一句“iOS已经烂大街了,没人要了”。都烂大街了,好忧伤!至于用人单位要求越来越高,我就不解释了,这个是你需要去好好反省反省的。最后我提到了小程序的冲击。为什么这么说呢?因为我感觉到小程序把一部分人的视线转移到了轻应用上面去了,这就导致一些native移动端的业务被小程序给抢走了。不过对一些业务比较简单的场景来说,小程序的确是一种比较合适的解决方案。一个是节省成本;另一个是方便快捷。 总之,现在的iOS开发工作真的是越来越难找了 。

分析了大的市场行情,再来看一下公司。公司如人,人有靠谱和不靠谱之分,公司亦是如此。前段时间的面试让我感觉到一个靠谱的公司招人还是挺难的。大牛不好请(关键是贵啊),小牛又看不上,而且还怕被忽悠,同时又要控制人力成本,所以用人单位考虑的要比应聘者多,他们一般情况下会找一个平衡点。即既要达到岗位要求,人力成本又要在可接受的范围之内。所以在招聘上那是一个纠结啊!稍微大一点的公司可能主要考虑聘者的技能了,因为大公司业务庞杂,规模和实力是小公司比不了的,对人才的渴求远比小公司要大。如何进大公司呢?是不是又该反省了!!!

啰嗦的有点多,我的开场白就到这里吧!下面说一下我的面试经历。

由于上家公司待的比较久,平常只顾撸码,导致忽视了知识点的总结。一下进入面试状态,面对面试官那么多的技术点问题,还真有懵!所以第一天在面试 昆仑亿发股份科技 和 51Talk 两家公司时表现不理想。由于好久没有参加过面试了,心理上没准备好,语言组织的不好,技术点回答的不到位,导致整个面试过程感觉比较糟。完全不在状态啊!相比第一家 昆仑亿发股份科技 ,第二家 51Talk 表现的比较从容一点,一面我感觉问题不大。可二面的问题感觉有点奇葩,有点吃不准。比如面试官司问你之前公司(P2P金融)有催收吗?是怎么催收的?针对第一个问题我回答有,但第二个问题我该怎么回答。我有点方,不知道他想考什么。是考查我对公司业务的了解程度还是试怀疑我之前待的公司是否是一个不正当的打手公司。我笑笑,没说话...不过挺郁闷的。我一个程序员一定要去了解催收部门的手段吗???第一天就碰了俩钉子。不过也没关系,成事开头难嘛。随即,我加强了技术点的学习总结和面试技巧的学习。

面试是切磋,更是交流。通过面试,即能发现自身的不足,又能对自己从事的工作有更全面的了解。接下来的面试我去了 滴滴、58同城、懂球帝、皇包车旅行、借贷宝、罗辑思维、美团、新浪 等公司。滴滴的面试是印象最好的。面试官比较随和,专业,干脆,几个问题下来明显的能感觉到对方内功很深; 58同城 主要问的最近的项目,你在项目中做了哪些东西以及工程中使用到了哪些比较好的技术点; 懂球帝 问的问题便向设计,不过面试官的态度不怎么友善,一副不耐烦的样子; 皇包车旅行 问的主要是设计方面的问题,便向于架构方面; 借贷宝 是感觉最不好的一个,老是被打断,都不能了好的表达自己了,所以聊到一半我就放弃离开了; 罗辑思维 面试官挺温和的,感觉不错; 美团 面试官是绵里藏针,要小心回答面试官的问题,不要打哈哈; 新浪 面我的是一个老程序员了(大牛),问的东西比较大,而且偏向后端的大并发,有点小郁闷。为什么不找一个iOS程序员跟我聊呢?在跟不同的面试官沟通交流的时候的确学到了不少的东西,而且还增加了不沟通交流的技巧。最重要的就是跟很多同行过了招,发现了自身的很多不足不处,这会还在反省呢!

总结一下面试的要点:

做到以上几点,感觉offer也离你不远了!

经过辛苦的耕耘,最终拿到了4家公司的offer,对这份成绩还算满意。不过,前路仍然漫漫,需要更加努力!

最后还有一个比较痛的领悟:

ok!下面奉上本人总结的iOS面试题:

下面还有一些更干的面试题,你值得拥有!

招聘一个靠谱的 iOS

github里面有大神附上了答案

招聘一个靠谱的 iOS 答案

这里还有MrPeak大神的中级面试题

iOS 中级面试题

下面是答案

iOS 中级面试题 答案

明天放假!

祝小伙伴们“五一”国际劳动节快乐啊!

更新

MrPeak 大神的中级面试题的答案链接中,有的答案不准确,仅供小伙伴们参考!


文章标题:ios开发面试题,ios开发面试题及答案
文章URL:http://pwwzsj.com/article/dsipecc.html