写在前边:时间久远,个数跟次序记不清楚了,挑着印象深刻的来些。
一、笔试
1.详述delegate , block , notification,KVO
2.分类能否扩展属性,若能则如何实现?
3.常用的设计模式有哪些,如何实现,画出UML图更佳。
4.有一个无序的int数组array,将其排序,再找出比array[0]大的所有元素组成的数组。(算法题)
5.设有一个UIView类型的View,找出这个View所有子视图中第一个subview是UIImageView类型的view。
6.对开源开发社区做过怎么样的共享。
7.简述H5跟Native是如何通信的。
备注:概念的题目可以少写点,把算法题都做了。技术面试还要挨个问一遍。
二、技术面试
1.先详细问了下笔试,口头再阐述一次。
2.autorelease对象是何时释放的?
3.RunLoop是什么,如何工作的?
4.分类能添加方法底层是如何实现的?
5.常用多线程编程有哪几种方式,最喜欢用哪种,为什么?
6.并发队列会产生大量的子线程,如何控制管理?
7.设有operationA,operationB, operationC三个任务,B、C只有在A执行完之后才可以工作,如何实现,有哪几种方式?
8.口述H5跟Native通信。
9.__block的工作原理是什么?
10.KVO是如何实现的?
11.你的期望薪资是多少?
备注:这一轮面试完,技术会让你等会儿,他去汇报,如果过会儿总监没来面试,基本就没戏了。我前边的两个就是等了好久总监都没来,技术让他们回去等通知了。
三、总监面试
1.有没有用别的语言开发的经验?
2.网络编程有没有做过?
3.跟你详细解释下入职之后的工作内容,工作时间等(基本上都是围绕加班。。听他的意思一般要九、十点才好下班吧)
4.你的期望薪资是多少?
5.围绕你的期望薪资开始打听上家公司多少钱;每月要消费多少,留多少;他们公司涨钱有规定等不着边际的砍价。
最后就是回去等通知吧,还有个总经理复议。
备注:我在第5点毫不松口,一点也没让他砍,紧接着他就让我走了。不知道后边还有没有问题。。。。
-------------------------------- 华丽丽的分割线 -------------------------------------------
给出自己面试回答的答案:
一、笔试
1.答:
delegate通过协议进行通信,越来越多的被用于面向接口编程。
block能捕获上下文,广泛的用于回调。
notifaction一对多,无需关注接受者
KVO实施对属性监听。
2.能,使用runtime,associate相关方法。
3.答:
策略 -> 管理通用方法
工厂-> 批量Cell
MVVM -> 抽象ViewModel,轻量级ViewController
单例 -> 管理类
观察者 -> KVO+KVC
4.使用冒泡排序,将最小的放到前边,截取除第一位之外的其他元素。
5.使用递归。(为了方便在Xcode中手码了)
-(void)finView:(UIView*)view
{
if (!view || !view.subviews.count)
{
return;
}
for (int i = 0;
i < view.subviews.count; i++) {
UIView* sub= view.subviews[i];
if (!i && [sub isMemberOfClass:[UIImageView class]])
{
[self.views addObject:sub];
}
[self finView:sub];
}
}
6.Code4app上传过两次代码,对第三方库push过BUG。
7.UIWebView可以调用js。H5可以通过插入iFrame或发送ajust请求,通过webView拦截,可以调用响应的插件。
备注:对开源社区的贡献实在让人脸红~我上过的两次代码,其中一份被人喷死了。。
二、技术面试
1.过一遍上述笔试题,口述一次,不过要多说点,我是没闲着
2.autorelease被加入到最近的autoreleasepool,会随着runLoop进行周期性的poolPush 跟 poolPop释放。如果说函数执行完就释放或者过段时间就释放,就可能中招了~
3.RunLoop是运行循环,是控制他所属的线程周期性的执行任务,有任务就工作没任务就休眠。跟RunLoop相关API有NSThread , NSTimer , CATransaction,NSURLConnection,NSURLSession,autoreleasepool,CAAnimation,performSelector等一些列。
4.Objective-C中的类也是个对象,唤作类对象。底层是个结构体。其中有个methodList和propertyList的数据结构.分类其实也是个结构体,它里边有个相应的结构,在类被编译时,类对象会查到它所有的分类,把分类中的methodList跟propertyList加入到自己的methodList和propertyList中。这就是分类能添加方法跟属性的原因。
5.NSThread,NSOperation,GCD。
NSthread对象生成子线程,但是需要手动管理内存,单次任务可使用,不建议执行周期性任务。可以使用performSelectorOnThread,或者detachThread。。。执行单次任务。
最常用的是GCD,高度抽象,使用者只需关注与任务,不需要理会线程和内存管理。
最喜欢的是NSOperation,更加灵活,而且有cancel方法。
6.不知道他想问的时候什么,我只说尽量把任务集中到复用的queue上,减少任务拆分。
(后话,我回头看了看资料,这个queue能产生的线程是由内核决定的,稍后再补~)
7.第一种:使用NSOperationQueue添加依赖
第二种,使用GCD屏障(我不知道barrier怎么拼写)或者dispatch_group
第三种,使用串行的queue,(串行怎么拼?)
8.笔试中一样的,略
9.__block其实会把修饰的变量转换成结构体,修饰的变量会作为一个属性被声明在其中。block其实也是个结构体,会把在块内用到__block变量声明到其中并通过外部变量指针初始化。这样在block内外都可以修改__block修饰的变量了。(口述思路有点乱)
10.被监听的类,会被系统默认的实现一个匿名的子类,重写被监听的属性的setter方法。(我也就了解这么多了。。)
11.XXK
备注:有些问题我想不起来了,不过这轮面试完,他们的总监过来跟我说:我们技术说你很懂底层,很不错~~(瞬间腰板儿就挺直了~~
)
三、总监面试
1.答,C,C++,忘记说cocos-2d了。。
2.上去没搞懂什么算网络编程,只好说iOS这块的网络通信懂~
3.答:9:00 — 6:30 , 9:30 — 7:00,这是他们的工作时间。
通常要加班到8、9点。
新团队要招十个人,我去的时候才找到一个新手。需要高手带团队~
最后问了我老婆多少钱,我每月消费多少钱,大概意思就是能不能少点~我用贷款+欠债妥妥的回绝了他~~然后就是等通知了。
后记: 这是第三天了,估计真的没戏了耶~~,上述的答案都是我自己理解的,并不一定是对的。留言探讨吧~