你能用到的 iOS 面试题 (三)

3,717 阅读8分钟

题目来源这里 本篇文章解答的是一般性问题,之前的2篇文章iOS开发-你能用到的面试题(一),iOS开发-你能用到的面试题(二)

最近这两天你有学到什么知识/技能么?

面试官也知道你这两天都在找工作,但是他还是这样问的目的是想知道你对这两天的面试准备了什么?

参考答案:
第一,这两天我对之前做的笔记整理了一下,对之前工作上遇到的BUG,坑进行了梳理(这里说下遇到了哪些BUG或者坑).第二,要在新的工作中展现新的自己,告别过去.第三,对未来的自己定下一个目标

最近有做过比较酷或者比较有挑战的项目么?

这个问题着重点在于酷和挑战.酷是想问下你有没有做过应用很多动画的项目,挑战是想问下你有没有做过什么有技术难点,然后你把它逐一攻破的项目.但是如果没做过也不能回答一句这个没做过,面试官问这个问题主要是想看下你有没有学习能力和解决问题的能力,一句没做过会让你减分不少.

参考答案:
酷这方面可以说自定义的炫酷的转场动画,还有一些细节上的动画,譬如半糖的那个下拉刷新个人就觉得很酷,什么值得买里的商品百科里用到的动画也很多.没做过这方面没事,但必须能说出一二点是如何实现这些动画的,gihub上有很多关于动画的小demo.
挑战这方面个人觉得分两方面.假如你是管理层的,可以说下你是如何解决团队中的冲突,如何代码模块化.假如你是技术这块的,可以说下你在工作中遇到了哪些技术难点,你是怎么去解决这个技术难点的等等.

最近看过的书/文章有哪些?

这个问题考察的也是你是否喜欢钻研技术,学习技术,也可以从你看的书中大概明白你是属于什么档次的

参考答案:
最近在看《The Swift Programming Language》,喜欢看一些博客,如果有喜欢看英文文档或者博客的这里可以重点说明下,毕竟很多公司都是需要程序员可以看懂英文文档的.

为什么要学习编程,编程对你而言的乐趣在哪儿?

这个问题面试官想考察的是你对编程的认知是什么,编程对于你而言是什么,你对编程的态度如何,你是否是对这个编程有浓厚的兴趣而不是纯粹的只是因为这行赚钱多才做这行

参考答案:
为什么学习编程这边可以介绍下你是如何进入这行的,乐趣对于我而言有以下几点吧.第一,看着代码一行行从指下敲出,然后慢慢构建成一个完整的APP的那种愉悦感.第二,花费长时间去解决一个BUG,当最终解决掉这个BUG后那种酣畅淋漓的感觉.第三,有人问你问题,然后你帮忙解决以后,那种满足的感觉.第四,你可以和懂技术的人聊天,就像大学时候大家一起聊LOL一样

如果一个函数10次中有7次正确,3次错误,问题可能出现在哪里?

这个问题面试官考察的就是个人的水平的,还有你如何考虑问题,解决bug的能力.因为这个只是出错,并没有崩溃,看不到crash日志,也不能通过别的工具来定位错误

参考答案:
1.首先既然有正确有错误,那么这个bug肯定是不一定会出错的,先看函数条件是否有漏写
2.然后再检查函数是否会存在空的情况
3.反复操作以上步骤去查明每个调用的函数结果都是正确的

自身最大优点是什么,怎么证明?

这个问题其实蛮难回答的,大部分人要他列举优点会不知道该怎么讲,就和别人问我你最喜欢你女友哪一点一样,不知道该怎么去回答

参考答案:
最大优点有点不好讲,可以讲讲有哪些优点
1.可以说学习能力强,能很快接受新事物(这里就可以讲讲你最近学了一些什么新技术)
2.笔者的话闲暇喜欢写写博客,回答回答群里的问题,看些博客,多记笔记,高仿些APP
3.如果你有参与过开源项目或者github上有什么开源项目这里也可以说出来
4.可以讲下你觉得你技术最牛逼的地方,自己有专精的技术肯定要讲出来,说的越多越好

开发常用的工具有哪些?

通过这个问题面试官也可以大概知道你是什么水平的,如果你只能讲什么xcode,cocoapods或者xcode自带的一些工具的话面试官也许就会把你定位于初级

参考答案:
1.友盟统计
2.青花瓷:这个软件还是蛮不错的,可以用来过滤网络请求,模拟低速网路,还可以修改网络请求内容这些
3.Reveal:调试页面不错,还有用来学习别人的demo时候可以拿来看UI层次结构,还可以用来标记可以设为透明的控件,用来优化性能

熟悉 CocoaPods 么?能大概讲一下工作原理么?

这个的话大部分人应该都会用,可以讲下CocoaPods有哪些注意点,原理的话不讲也没啥事,毕竟这个工具大家只要会用就行

参考答案:
CocoaPods注意点:CocoaPods在pod install以后会生成一个Podfile.lock的文件,这个文件在多人协作开发的时候就不能加入在.gitignore中,因为这个文件会锁定当前各依赖库的版本,就算之后再pod install也不会更改版本,不提交上去的话就可以防止第三方库升级后造成大家各自的第三方库版本不同

CocoaPods原理:
1.Pods项目最终会编译成一个名为libPods.a的文件,主项目只需要依赖这个.a文件即可
2.对于资源文件,CocoaPods提供了一个名为Pods-resources.sh的bash脚本,该脚本在每次项目编译的时候都会执行,将第三方的各种资源文件复制到目标目录中
3.CocoaPods通过一个名为Pods.xcconfig的文件在编译时设置所有的依赖和参数

最常用的版本控制工具是什么,能大概讲讲原理么?

这个版本控制看公司要求了,git的工具是SourceTree,svn的工具是Cornetstore,原理的话把常用的几个命令记一下就好,git的话大家可以看下廖雪峰写的一本Git的书,github上大家可以搜下

今年你最想掌握的一门技术是什么?为什么?目前已经做到了哪个程度?

最想掌握的技术肯定是自己不会的了,为什么,那肯定是想技术更牛逼嘛,什么程度呢就自己把握了.

参考答案:
个人的话今年想深入的研究一下动画,并且把Switf巩固下.这个答案其实想怎么说都行.

你一般是怎么用 Instruments 的?

这个问题也就是考察下你经验如何了, Instruments里面工具很多,也没必要逐一说明,挑几个常用的说下就好

参考答案:
1.Time Profiler:性能分析
2.Zombies:检查是否访问了僵尸对象,但是这个工具只能从上往下检查,不智能
3.Allocations:用来检查内存,写算法的那批人也用这个来检查
4.Leaks:检查内存,看是否有内存泄露

你在你的项目中用到了哪些设计模式?

设计模式有很多,面试官肯定不想听你把项目里的设计模式名字报给他,他想听得肯定是你是怎么去用这些设计模式的

参考答案:
1.MVC:这个设计模型大部分应用应该都在用,介绍下MVC就好
2.单例:单例在项目中用的还是蛮多的,像登录界面,对一些第三方框架二次封装等等
3.KVC/KVO:这个用的应该也很多,KVC用来替换掉系统的tabbar,用KVO来监听偏移量来完成下拉刷新,改变导航条背景颜色这些
4.工厂方法:这个用的更多了,设置一些自定义View肯定要用到这个设计模式

如何实现单例,单例会有什么弊端?

这个问题还是蛮简单的,说下单例是怎么写的,单例的缺点就好

参考答案:

// OC版
+ (instancetype)sharedInstance
{
    static id sharedInstance = nil;

    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{

        sharedInstance = [[self alloc] init];
    });

    return sharedInstance;
}

// Swift版
static let sharedInstance : <#SingletonClass#> = <#SingletonClass#>()

单例的缺点也就是会一直占着这块内存,不会被释放

iOS 是如何管理内存的?

这个问题的话上篇文章也提到过,讲下block的内存管理,ARC下的黄金法则

这里说下swift里的内存管理:
delgate照样weak修饰,闭包前面用[weak self],swift里的新东西,unowned,举例,如果self在闭包被调用的时候可能为空,则用weak,反之亦然,如果为空时使用了unowned,程序会崩溃,类似访问了悬挂指针,在oc中类似于unsafe_unretained,类似assign修饰了oc对象,对象被销毁后,被unowned修饰的对象不会为空,但是unowned访问速度更快,因为weak需要unwarp后才能使用